数组算法有几处不能理解
本帖最后由 番茄 于 2012-6-1 23:12 编辑已经一天了也没有弄明白。解答能不用初高中数学公式就不要用了,:dizzy: 没读过初高中,你写了我也看不懂
表达能力不好(*^__^*) 嘻嘻……。设置了红色字体的部分,就是我想不明白的地方,想不明白它为什么要这样做。求 “数组存储映像常量基地址” 的原理 是什么??
#define MaxArraySize 2
typedef struct
{
DataType *base; /*数组元素的基地址*/
int dim; /*数组的维数*/
int *bounds; /*数组的每一维之间的界限的地址*/
int *constants; /*数组存储映像常量基地址*/
}Array;
int InitArray(Array *A,int dim,...)
/*数组的初始化操作*/
{
int elemtotal=1,i; /*elemtotal是数组元素总数,初值为1*/
va_list ap;
if(dim<1||dim>MaxArraySize) /*如果维数不合法,返回0*/
return 0;
A->dim=dim;
A->bounds=(int *)malloc(dim*sizeof(int)); /*分配一个dim大小的内存单元*/
if(!A->bounds)
exit(-1);
va_start(ap,dim); /*dim是一个固定参数,即可变参数的前一个参数*/
for(i=0;i<dim;++i)
{
A->bounds=va_arg(ap,int); /*依次取得可变参数,即各维的长度*/
if(A->bounds<0)
return -1; // 在math.h中定义为4
elemtotal*=A->bounds; /*得到数组中元素总的个数*/
}
va_end(ap);
A->base=(DataType *)malloc(elemtotal*sizeof(DataType)); /*为数组分配所有元素分配内存空间*/
if(!A->base)
exit(-1);
A->constants=(int *)malloc(dim*sizeof(int)); /*为数组的常量基址分配内存单元*/
if(!A->constants)
exit(-1);
A->constants=1;
for(i=dim-2;i>=0;--i)
A->constants=A->bounds*A->constants; //求 “数组存储映像常量基地址” 的原理
return 1;
}
void DestroyArray(Array *A)
/*销毁数组。将动态申请的内存单元释放*/
{
if(A->base)
free(A->base);
if(A->bounds)
free(A->bounds);
if(A->constants)
free(A->constants);
A->base=A->bounds=A->constants=NULL; /*将各个指针指向空*/
A->dim=0;
}
int GetValue(DataType *e,Array A,...)
/*返回数组中指定的元素,将指定的数组的下标的元素赋值给e*/
{
va_list ap;
int offset;
va_start(ap,A);
if(LocateArray(A,ap,&offset)==0) /*找到元素在数组中的相对位置*/
return 0;
va_end(ap);
*e=*(A.base+offset); /*将元素值赋值给e*/
return 1;
}
int AssignValue(Array A,DataType e,...)
/*数组的赋值操作。将e的值赋给的指定的数组元素*/
{
va_list ap;
int offset;
va_start(ap,e);
if(LocateArray(A,ap,&offset)==0) /*找到元素在数组中的相对位置*/
return 0;
va_end(ap);
*(A.base+offset)=e; /*将e赋值给该元素*/
return 1;
}
int LocateArray(Array A,va_list ap,int *offset)
/*根据数组中元素的下标,求出该元素在A中的相对地址offset*/
{
int i,instand;
*offset=0;
for(i=0;i<A.dim;i++)
{
instand=va_arg(ap,int);
if(instand<0||instand>=A.bounds)
return 0;
*offset+=A.constants * instand;
}
return 1;
}
dim是用户指定数组大小, 按这个大小动态分配空间 , 把申请空间基地址,大小等信息,Init给Araay
使用AraayInit Ok data, 对数组地址偏移进行操作 :P我看不懂 建议楼主自学点数学知识,没你想像的那么难 {:5_100:}你这样的版式看着很头晕哎。。看两行就看不下去了。。
而且楼主你没有定义DataType 哎,学好数理化,数组我不怕:lol regergerher
学习,支持一下!加油:loveliness: 慢慢来吧,只能这样了
页:
[1]