(数据结构第五章)数组实现
2015-04-11 15:06
281 查看
///********数组顺序存储表示*********** #include<cstdio> #include<algorithm> #include<cstring> #include<stdarg.h> ///标准头文件,提供va_start、va_arg和va_end ///用于存取变长参数表 using namespace std; #define MAX_ARRAY_DTM 8 ///假设数组位数最大值为8 #define ERROR 0 #define OVERFLOW -2 #define UNDERFLOW -100 #define OK 1 typedef struct { int *base; ///数组元素基址,由 InitArray分配 int dim; ///数组维数 int *bounds; ///数组维界基址,由 InitArray分配 ///暂时不太清楚这是干啥的 int *constants; ///数组映像函数常量基址,由 InitArray分配 ///这个就是用来存放ci的。给出ci的递归定义:Cn = L, Ci-1=Bi*Ci,1<=i<=n }Array; bool InitArray(Array &A, int dim,...) { ///若维数dim和各维长度合法,则构造相应数组A,并返回OK if(dim < 1 || dim > MAX_ARRAY_DTM) return ERROR; A.dim = dim; A.bounds = (int *)malloc(dim * sizeof(int)); if(!A.bounds) exit(OVERFLOW); ///若各维度长度合法,则存入A.bounds,并求出A的元素总数elemtotal int elemtotal = 1; va_list ap; va_start(ap, dim); ///ap为va_list类型,是存放变长参数表信息的数组 for(int i=0;i<dim;++i){ A.bounds[i] = va_arg(ap, int); if(A.bounds[i] < 0) return UNDERFLOW; elemtotal *= A.bounds[i]; } va_end(ap); A.base = (int *)malloc(elemtotal * sizeof(int)); if(!A.base) exit(OVERFLOW); ///求映像函数的常数c,并存入A.constants[i + 1],i=1,...,dim A.constants = (int *)malloc(dim * sizeof(int)); if(!A.constants) exit(OVERFLOW); A.constants[dim - 1] = 1; ///L=1,指针的增减以元素的大小为单位 ///L的话不应该是1啊 for(int i=dim - 2; i >= 0; --i) A.constants[i] = A.bounds[i+1]*A.constants[i+1]; return OK; } int DestroyArray(Array &A) { ///销毁数组A if(!A.base) return ERROR; free(A.base) ; A.base = NULL; if(!A.bounds) return ERROR; free(A.bounds); A.bounds=NULL; if(!A.constants) return ERROR; free(A.constants); A.constants = NULL; return OK; } int Locate(Array A, va_list ap, int &off) { ///若ap指示的各下标值合法,则求出该元素在A中相对地址off off=0; for(int i=0;i<A.dim;i++) { int ind = va_arg(ap, int); if(ind < 0 || ind >= A.bounds[i]) return OVERFLOW; off += A.constants[i] * ind; } return OK; } int Value(Array A, int &e,...) { ///A是n维数组,e为元素变量,随后是n个下标值 ///若各下标不超界,则e赋值为所指定的A的元素值,并返回OK va_list ap; va_start(ap,e); int result,off; if((result = Locate(A,ap,off))<=0) return result; e = *(A.base + off); return OK; } int Assign(Array &A, int e,...) { ///A是n维数组,e为元素变量,随后是n个下标值 ///若下标不超界,则将e的值赋值给所指定A的元素,并返回OK va_list ap; va_start(ap, e); int result,off; if((result = Locate(A,ap,off))<=0) return result; *(A.base + off) = e; return OK; } int main() { Array A; InitArray(A,2,5,5); ///测试Assign Assign(A,0,0,0); ///测试Value int e=100; Value(A,e,0,0); printf("e=%d\n",e); DestroyArray(A); return 0; }中途竟然去找Locate函数传的参数怎么用,以为直接在main里用呢...sb了
相关文章推荐
- 数据结构编程笔记十二:第五章 数组和广义表 数组顺序存储的实现
- 数据结构复习:队列-Java数组实现
- 数据结构-实现数组
- 【C++数据结构学习笔记---栈】用数组实现栈
- php的哈希(实现数组的数据结构)
- 数据结构 二叉堆 数组实现
- 用C#编程语言实现数据结构传递整型变量、字符串和数组的方法
- java数据结构:线性表之数组实现
- 【C++数据结构学习笔记---线性表】用数组实现线性表
- 数据结构:队列(循环数组实现)
- (1)数据结构——线性表(数组)实现
- 重学数据结构004――栈的基本操作及实现(数组实现)
- 0元素数组实现变长TLV数据结构
- javascript的数组实现数据结构中的堆栈和队列
- [数据结构]第五章-数组和广义表(读书笔记1)
- javascript中数组Array对象调用不同的方法可以实现几种数据结构
- 数据结构: 图的数组表示实现
- 数据结构队列之环形队列的动态数组实现:queue
- [数据结构]第五章-数组和广义表(读书笔记3)
- C++数据结构--用向量数组实现大(小)根堆的插入和删除