#include<stdio.h>//std(standard) IO #include<stdarg.h>//std(standard) arguments #define OK 1 #define ERROR 0 #define MAXDIM 8//定义的最大数组维度 typedef int Status;//表示返回的状态值 typedef int ElemType//int来表示某一种元素类型 /* 1、几乎绝大部分语言中都将数组设置为默认类型,本章用抽象数据类型的形式描述和实现数组,以及高维数组 2、stdarg提供va_start(),va_arg(),va_end()三个函数来获得外部函数的不定长参数的值 3、 4、 5、 */ //数组的结构体定义 typedef struct { ElemType *base; int dim;//数组维数,在数组中1代表最高维,dim代表最低维 int *bound;//每一维的长度bound[0]为最高维的长度,bound[dim-1]为最低维的长度 int *constants;//对应维度的索引加减一时对应的内存跨度,即最低维索引加一仅在内存地址上加一,而第二低的则是bound[dim-1]*constants[dim-1] }Array; //初始化数组 //O(dim) status InitialArray(Array &A,int dim,...) { int i,total=1;//total存储总的需求的内存 va_list args;//用于获取不定长参数的列表 if(dim<1||dim>MAXDIM)//限制dim的范围 { return ERROR; } A.dim=dim;//设置维数 //给bound开辟一个数组存储每一维的长度 A.bound=(int*)malloc(dim*sizeof(int)); if(!A.bound) { exit(OVERFLOW); } va_start(args,dim); for(i=0;i<dim;i++) { A.bound[i]=va_arg(args,int)//获取不定长参数,其中args在va_arg函数之后会自动向前改变指针,第二个参数写获取的参数的类型 if(A.bound[i]<1) { return ERROR;//维的长度不允许小于一 } total*=bound[i];//计算总的内存需求 } va_end(args); //给constants开辟数组,存储每一维对应的内存跨度 A.constants=(int*)malloc(dim*sizeof(int)); if(!A.constants) { exit(OVERFLOW); } A.constants[dim-1]=1;//最小维的内存跨度为1 for(i=2;i<=dim;i++) { A.constants[dim-i]=A.constants[dim-i+1]*A.bound[dim-i+1];//低一维的长度和内存跨度相乘为高一维的内存跨度 } //最后给数组开辟内存 A.base=(ElemType*)malloc(total*sizeof(ElemType)); return OK; } //销毁数组 //一次释放数组结构体中被分配存储的三个指针 //O(1) Status destroy(Array &A) { if(!A.base||!A.constants||!A.bound) { return ERROR;//若未初始化则销毁失败 } free(A.base); free(A.bound); free(A.constants); A.base=NULL; A.bound=NULL; A.constants=NULL; return OK; } //读取索引对应在数组的值,通过e来返回 //O(A.dim) Status GetValue(Array A,ElemType &e,...) { int i,j,k; va_list args; va_start(args,e);//获取e后面的参数 for(i=0;i<A.dim;i++) { j=va_args(args,int);//获取索引参数 if(j<0||j=>A.bound[i])//超出索引范围则返回错误 { return ERROR; } k+=j*A.constant[i];//记录总偏移 } va_end(args); e=A.base[k];//用相对位置k来索引元素 return OK; } //在对应索引的数组赋新的值 //O(A.dim) Status SetValue(Array &A,ElemType e,...) { int i,j,k; va_list args; va_start(args,e);//获取e后面的参数 for(i=0;i<A.dim;i++) { j=va_args(args,int);//获取索引参数 if(j<0||j=>A.bound[i])//超出索引范围则返回错误 { return ERROR; } k+=j*A.constant[i];//记录总偏移 } va_end(args); A.base[k]=e; return OK; }