数组的顺序存储结构 ◆数组的顺序存储结构:将数组元素顺序地存放在一片连 续的存储单元中。 ◆二维数组有两种存储方式:以列序为主序( column major order)的存储方式,如图6-2(a所示和以行序 为主序( row major order)的存储方式,如图6-2(b) 所示。 ◆地址计算:以行序为主序的存储方式为例: LOCij=LOC[0, 0+(b2xi+jxL LoC[U12…,d]Loc0.0,,0+(b2×,×如x×j+b3×.x×j2 ◆推广到n维数组 +…+如×+)xL 0C0.…,+∑∏+
数组的顺序存储结构 数组的顺序存储结构:将数组元素顺序地存放在一片连 续的存储单元中 。 二维数组有两种存储方式:以列序为主序(column major order)的存储方式,如图6-2(a)所示和以行序 为主序(row major order)的存储方式,如图6-2(b) 所示。 地址计算:以行序为主序的存储方式为例: 推广到n维数组: LOC[i,j]=LOC[0,0]+(b2i+j) L
LAon 1 LOCCAl(y=LOC(ao1) 10 A A,( Alc LOCKAm-1 (1)-LOC(aon-1)[AInI m.41) A(2=(Ao(1),A1(1),…,Ax1(1 A(2(A01),A11),…,Am1(1) A A21(a10 以列序为主序 以行序为主序
A0 (1) A1 (1) An-1 (1) 以列序为主序 以行序为主序
数组的顺序存储表示和实现的算法 typedef struct ElemType *base, /*数组元素初始地址,由初始 化操作实现* int dim /*数组的维数*/ int *bounds /*数组各维的长度,也由初始化 操作实现* int *const;/*数组的映象函数常量的初始 地址,由初始化操作实现*
数组的顺序存储表示和实现的算法: typedef struct { ElemType *base; /*数组元素初始地址,由初始 化操作实现*/ int dim; /*数组的维数*/ int *bounds; /*数组各维的长度,也由初始化 操作实现*/ int *const ; /*数组的映象函数常量的初始 地址,由初始化操作实现*/ } ;
◆数组的初始化算法: Status InitialArray array &A, int Adim) /*如果维数Adim和数组各维的长度 bounds合法,构造相应的数 组A,并返回OK值* {/*如果维数Adm不合法,返回值为 error*/ if (Adim<1 Adim> MAXDIM) return error g A dim=Adim. A bounds=(int*)malloc(Adim*sizeof(int) if(lA bounds) exit(overflow) 如果各维长度合法,则存入 A bounds,并求出A的元素总 数 totanus totalnum=1 va_start(ap,Adim);/*ap为存放变长参数表信息的数组, 其类型为 va list*/
数组的初始化算法: Status InitialArray(Array &A, int Adim) /*如果维数Adim和数组各维的长度bounds合法,构造相应的数 组A,并返回OK值*/ { /*如果维数Adim不合法,返回值为error */ if (Adim<1||Adim> MAXDIM) return error ; A.dim=Adim; A.bounds=(int* )malloc(Adim*sizeof(int)); if (!A.bounds) exit (overflow); /*如果各维长度合法,则存入A.bounds,并求出A的元素总 数totalnum*/ totalnum=1; va_start(ap, Adim); /*ap为存放变长参数表信息的数组, 其类型为va_list*/
for(i=0; i<Adim; ++i) A bounds[i]=va_arg(, int) if(A bounds]<O return(underflow) totalnum*= A bounds va_end(ap) A base=(ElemType*malloc(dim*sizeof(ElemType)); if(lA base exit(overflow) /*求映象函数的常,把结果存入 A const[i-1],i=1,…,Adim*/ A const=(int*malloc(dim*sizeof(int) if(lA. const) exit(overflow) A. const[Adim-1]=1;/*指针的增减以元素的大小为单位*/ for(i=Adim-2; i>=0, i-) A const i]=A bounds i+1*A const i+1 return OK
for(i=0;i<Adim;++i) { A.bounds[i]=va_arg(ap,int); if(A.bounds[i]<0) return (underflow); totalnum* = A.bounds[i]; } va_end(ap); A.base=(ElemType*)malloc(dim*sizeof(ElemType)); if(!A.base) exit(overflow); /*求映象函数的常,把结果存入A.const [i-1],i=1,…,Adim*/ A.const=(int*)malloc(dim*sizeof(int)); if(!A.const) exit(overflow); A.const [Adim-1]=1; /*指针的增减以元素的大小为单位*/ for(i=Adim-2;i>=0,i--) A.const [i]=A.bounds[i+1]*A.const [i+1]; return OK; }