华为oj 迭代器

来源:互联网 发布:万师傅家具安装软件 编辑:程序博客网 时间:2024/05/22 15:05
#ifndef SLICE_ITERATOR_H#define SLICE_ITERATOR_H#include <stdlib.h>#define MAX_COORD_NUM 10typedef 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 - 10return -1;for(int i =0 ;i < slice_desc->coord_num;i++)if(slice_desc->coord_spec[i] < 0 )//维度下标最大值不能小于0return -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;elsereturn 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 - 10return -1;for(int i =0 ;i < slice_desc->coord_num;i++)if(slice_desc->coord_spec[i] < 0 )//维度下标最大值不能小于0return -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;}


0 0
原创粉丝点击