#ifndef SLICE_ITERATOR_H
#define SLICE_ITERATOR_H
#include <stdlib.h>
#define MAX_COORD_NUM 10
typedef struct
{
unsigned long start;//起始下标
unsigned long end; //结束下标
}CoordSlice;
typedef struct
{
int* first_element_of_orignal_array;//原始数组的第一个元素指针
unsigned long coord_num; //维度个数,最大取值为MAX_COORD_NUM,值为10
//原始数组从左到右各维度下标属性表示如下(从0到coord_num-1):
unsigned long coord_spec[MAX_COORD_NUM];//原始数组每个维度下标的最大取值
CoordSlice coord_slice[MAX_COORD_NUM];//切片在每个维度上的起止下标
}SliceDesc;
typedef struct
{
//结构内容由考生自行设计定义
int* first_element_of_orignal_array;//原始数组的第一个元素指针
unsigned long coord_num; //维度个数,最大取值为MAX_COORD_NUM,值为10
//原始数组从左到右各维度下标属性表示如下(从0到coord_num-1):
CoordSlice coord_slice[MAX_COORD_NUM];//切片在每个维度上的起止下标
unsigned long size[MAX_COORD_NUM];//每一维度下面填满后的大小。
unsigned long curr[MAX_COORD_NUM];//指针所对应的每一维度的下标
}SliceIterator;
int SliceIteratorInit (const SliceDesc* slice_desc, SliceIterator* slice_iterator);
int* SliceIteratorGetCurr(const SliceIterator* slice_iterator);
void SliceIteratorNext(SliceIterator* slice_iterator);
int SliceIteratorEnd(const SliceIterator* slice_iterator);
int CopySlice (const SliceDesc* slice_desc,int** first_element_of_slice_array,unsigned long* slice_element_num);
#endif
#include "SliceIterator.h"
/******************************************************************************
功能:初始化一个切片迭代器,使其指向切片内的第一个元素
输入:
slice_desc : 切片描述符指针(合法性由考生检查)
slice_iterator: 切片迭代器指针
输出:
slice_iterator: 初始化后的切片迭代器的指针
返回:
0:成功,-1:失败
说明:
1)SliceIterator结构需要由考生自行设计和定义
2)迭代器内存由调用者申请,大小仅为sizeof(SliceIterator),函数内部不得额外申请动态内存
3)用例保证其他接口的输入不会是未初始化过的迭代器指针
******************************************************************************/
int SliceIteratorInit (const SliceDesc* slice_desc, SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
//检测切片描述指针是否正确。
if(slice_desc == 0)//不为空
return -1;
if(slice_desc->coord_num < 1 || slice_desc->coord_num > 10)//coord_num在1 - 10
return -1;
for(int i =0 ;i < slice_desc->coord_num;i++)
if(slice_desc->coord_spec[i] < 0 )//维度下标最大值不能小于0
return -1;
for(int i =0;i < slice_desc->coord_num;i++)
if(slice_desc->coord_slice[i].start < 0 || slice_desc->coord_slice[i].end > slice_desc->coord_spec[i]|| slice_desc->coord_slice[i].start > slice_desc->coord_slice[i].end)//检测。。。
return -1;
slice_iterator->first_element_of_orignal_array = slice_desc->first_element_of_orignal_array;
slice_iterator->coord_num = slice_desc->coord_num;
for(int i = 0;i < slice_desc->coord_num;i++){
slice_iterator->coord_slice[i] = slice_desc->coord_slice[i];
slice_iterator->curr[i] = slice_desc->coord_slice[i].start;
}
for(int i =0;i < slice_desc->coord_num;i++){
slice_iterator->size[i] = 1;
for(int j = i+1;j < slice_desc->coord_num;j++)
slice_iterator->size[i] *= (slice_desc->coord_spec[j]+1) ;
}
return 0;
}
/******************************************************************************
功能:获取当前元素指针
输入:
slice_iterator:迭代器指针
输出:无
返回:指向当前元素的指针。若迭代结束,应返回空指针。
******************************************************************************/
int* SliceIteratorGetCurr(const SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
if(SliceIteratorEnd(slice_iterator))
return 0;
else{
int i, t = 0;
for(i = slice_iterator->coord_num-1; i > -1;i--)//unsigned真是坑。。。。
t += slice_iterator->size[i] * slice_iterator->curr[i];
return &slice_iterator->first_element_of_orignal_array[t];
}
return 0;
}
/******************************************************************************
功能:移动到下一个元素
输入:
slice_iterator 迭代器指针
输出:
slice_iterator 更新后的迭代器
返回:无
******************************************************************************/
void SliceIteratorNext(SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
slice_iterator->curr[slice_iterator->coord_num-1] ++;
for(int i = slice_iterator->coord_num-1; i > 0;i--)
if(slice_iterator->curr[i] > slice_iterator->coord_slice[i].end){
slice_iterator->curr[i-1] ++;
slice_iterator->curr[i] = slice_iterator->coord_slice[i].start;
}
return;
}
/******************************************************************************
功能:迭代是否结束
输入:
slice_iterator: 迭代器指针
输出:无
返回:1: 迭代已结束; 0:迭代未结束
******************************************************************************/
int SliceIteratorEnd(const SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
if(slice_iterator->curr[0] > slice_iterator->coord_slice[0].end)
return 1;
else
return 0;
}
/******************************************************************************
功能:创建一个数组切片的拷贝
输入:slice_desc: 切片描述符指针(合法性由考生检查)
输出:
first_element_of_slice_array:新的切片数组的第一个元素指针
slice_element_num:新的切片数组中元素个数
返回:0:成功,-1:失败
说明:first_element_of_slice_array内存在函数内申请,调用者释放
******************************************************************************/
int CopySlice(const SliceDesc* slice_desc,int** first_element_of_slice_array, unsigned long* slice_element_num)
{
/* 在这里实现功能 */
//检测切片描述指针是否正确。
if(slice_desc == 0)//不为空
return -1;
if(slice_desc->coord_num < 1 || slice_desc->coord_num > 10)//coord_num在1 - 10
return -1;
for(int i =0 ;i < slice_desc->coord_num;i++)
if(slice_desc->coord_spec[i] < 0 )//维度下标最大值不能小于0
return -1;
for(int i =0;i < slice_desc->coord_num;i++)
if(slice_desc->coord_slice[i].start < 0 || slice_desc->coord_slice[i].end > slice_desc->coord_spec[i]|| slice_desc->coord_slice[i].start > slice_desc->coord_slice[i].end)//检测。。。
return -1;
SliceIterator si;
SliceIteratorInit(slice_desc,&si);
int i = 0;
while(SliceIteratorEnd(&si) != 1){
i++;
SliceIteratorNext(&si);
}
*slice_element_num = i;
*first_element_of_slice_array = (int*)malloc(sizeof(int)*i);
int *q = *first_element_of_slice_array;
for(i = 0;i < slice_desc->coord_num;i++){
si.curr[i] = slice_desc->coord_slice[i].start;
}
while( SliceIteratorEnd(&si) != 1){
**first_element_of_slice_array= *SliceIteratorGetCurr(&si);
(*first_element_of_slice_array)++;
SliceIteratorNext(&si);
}
*first_element_of_slice_array = q;
return 0;
}
又开始做华为上的题目了,总算做对第二道题目了。
分享到:
相关推荐
最新版华为考试练习题库
华为练习Jar包 FemaleInfoCollection-mrs-2.0
实验需要的网络拓扑,配置命令,topo
实验需要的网络拓扑,配置命令,topo
2020华为云计算练习题含答案.docx
华为机考练习试题汇总
华为配置比较器华为配置比较器华为配置比较器 一款比较配置的软件,让你容易找出错误
实验需要的网络拓扑,配置命令,topo
华为云计算HCIE-Cloud LAB练习环境实验手册
支持华为固件下载中,解决华为固件下载难的问题,到处去找
本资源专门为华为HCIE备考人员准备,内含大量的HCIE实验,设计范围包括OSPF、IS-IS、BGP、IPv6、MPLS VPN、IPSEC VPN、VXLAN、L2TP、QoS、华为防火墙双机热备、华为防火墙虚拟系统等一共46个配置实验。可以供HCIE...
华为ensp模拟器,方便练习使用
一些华为eNSP部署示例,包括BFD、AC双链路备份、WLAN二层、三层部署实现,WLAN隧道模式、转发模式部署实现等,大多是WLAN无线部分部署实例,是...里面实验与本人博客文章对应,如果有不懂的可以私信我,本人为每位下载...
2015华为实习练习题,大家快来试试手吧,非常有收获的!!
实例CH203,使用STL风格迭代器。 (a) list.insert(list.end(),j):使用QList<T>::insert()函数插入10个整数值。此函数有两个参数:第一个参数是QList<T>::iterator类型,表示在该列表项之前插入一个新的列表项(使用...
华为od的练习题学习练习
我们知道华为的企业级无线基础功能是没有自带短信认证的,如果客户想要应用在商城环境中,如何解决这个问题呢? 我们可以借助华为自己的短信认证平台或者利用第三方的设备进行,比如深信服的AC行为管理设备。 该文档...
华为机试oj练习题2014
华为资料下载软件最新版!
HWFW_GUI v1.0.8 2019年4月14日最新版。华为光猫固件编辑器,用于编辑、修改光猫固件,定制固件工具