请大哥大姐帮我讲解一下数据结构(清华严的C版)建立数组的算法,我看不太明白
#include <stdarg.h>
#define MAX_ARRAY_DIM 8 //假设数组维数的最大值
typedef struct{
ElemType *base; //数组元素基址
int dim; //数组维数
int *bounds; //数组维界基址
int *constants; //数组映像函数常量基址
}Array;
Status InitArray(Array &A,int dim,...){
//若维数dim和各维长度合法,则构造相应的数组A,并返回ok
if(dim <1 || dim> MAX_ARRAY_DIM){
return ERROR;
}
A.dim = dim;
A.bounds = (int *)malloc(dim * sizeof(int));
//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
if(!A.bounds){
exit(OVERFLOW);
}
elemtotal = 1;
va_start(ap.dim);
for(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 = (ElemType *)malloc(elemtotal * sizeof(ElemType));
if(!A.base){
//求映像函数的常数Ci,并存入A.constants[i - 1],i = 1,...,dim
exit(OVERFLOW);
}
A.constants[dim - 1] = 1;
for(i = dim -2;i > = 0;--i){
A.constants[i] = A.bounds[i + 1] * A.constants[i + 1];
}
return ok;
}
[解决办法]
这个算法先定义了一个数组的结构,
base是数组每维元素的首地址;
bounds是数组的维的首地址;
contants不太明白;
接下来就是把函数的参数赋给A的各个元素,
先判断dim是否合法;
若合法则分配bounds内存空间;
把每维的长度存入bounds中;
va_start()我没见过,应该是stdarg.h中的,你查一下,
elemtotal * = A.bounds[i]求A中元素的总数;
A.base = (ElemType *)malloc(elemtotal * sizeof(ElemType))给A分配内存空间;
A.constants[dim - 1] = 1;
for(i = dim -2;i > = 0;--i){
A.constants[i] = A.bounds[i + 1] * A.constants[i + 1];
}
用到映像函数不明白;
[解决办法]
所谓数组的初始化,就是将数组类型的变量按照需要使用的空间大小,以及数组维数等信息都预先定义好,以便后来的使用
typedef struct{
ElemType *base; //数组元素基址
int dim; //数组维数
int *bounds; //数组维界基址
int *constants; //数组映像函数常量基址
}Array;
上述数据结构,以二维数组 A[7][3]为例,
执行初始化后的结果应该是:
base指向7*3*sizeof(Elemtype)大小空间的指针,dim的值为2 ,bounds指向数组大小为2(维数)的空间,第一维的大小为7,第二维的大小为3,constants指向的数组大小也为2,只是为了定位数组中的元素方便而设,减少运算而已,可以不要的,它的值应该是3和1,数组按行优先存储时,每一维的单位,算法中把Elemtype的大小设为1,
需要说明的是函数参数(Array &A,int dim,...),后面3个点表示调用时后面还可以有参数(参数个数不定时加)
调用该函数时是这样的InitArray(A,2,7,3)。
va_start、va_end等在stdarg.h中有定义,是宏
[解决办法]
大哥,好好钻研一下c语言和数据结构咯