[名校联盟]ch5 数组和广义表.pptVIP

  • 3
  • 0
  • 约6.67千字
  • 约 74页
  • 2017-04-22 发布于河南
  • 举报
[名校联盟]ch5 数组和广义表

第5章 数组和广义表(Arrays Lists);线性表——具有相同类型的数据元素的有限序列。;线性表——具有相同类型的数据元素的有限序列。;5.1 数组的定义; a11 a12 … a1n a21 a22 … a2n … … … … am1 am2 … amn; a11 a12 … a1n a21 a22 … a2n … … … … am1 am2 … amn;ADT Array { 数据对象: D={aj1,j2, ...,,ji,jn| ji =0,...,bi -1, i=1,2,..,n } 数据关系: R={R1, R2, ..., Rn} Ri={aj1,... ji,... jn , aj1, ...ji +1, ...jn | 0 ? jk ? bk -1, 1 ? k ? n 且k ? i, 0 ? ji ? bi -2, i=2,...,n } } ADT Array ;二维数组的定义:;基本操作:;Value(A, e, index1, ..., indexn);数组的基本操作;类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是一个 一维的结构。;5.2 数组的顺序表示和实现—一维;常用的映射方法有两种: 按行优先:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。 按列优先:先列后行,先存储列号较小的元素,列号相同者先存储行号较小的元素。 ;l2;第l1行;Loc (j1, j2,… jn)=LOC(0,0,…0)+;“行序为主序” 即 “低下标优先”;例2:已知二维数组Am,m按行存储的元素地址公式是: Loc(aij)= Loc(a11)+[(i-1)*m+(j-1)]*K 按列存储的公式是?;例3:设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 。;#define MAX_ARRAY_DIM 8 //假设最大维数为8 typedef struct{ ELemType *base; //数组元素基址 int dim; //数组维数 int *bound; //数组各维长度信息保存区基址 int *constants; //数组映像函数常量的基址 }Array;; stdarg.h :利用宏va_start、va_arg和va_end提供 遍历未知数目和类型的函数参数表的功能。;Status InitArray (Array A, int dim,…) { //若维数dim和各维长度合法,则构造相应的数组A并返回OK if (dim1||dimMAX_ARRAY_DIM) return ERROR; A.dim=dim; A.bounds=(int *)malloc(dim * sizeof(int)); if(!a.bounds) exit (OVERFLOW); // 分配存放“各维长度”的空间 //若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal elemtotal=1; va_start(ap, dim); //ap为va_list类型,是存放变长参数表信息的类型,将ap指 向dim后的第一个参数; for(i=0;idim;++i) { A.bounds[i]=va_arg (ap, int); // 返回ap当前指向的参数,并按参数类型将ap指向下一个参数 if (A.bounds[i]0) return UNDERFLOW; elemtotal *=A.bounds[i]; } va_end(ap); // ap使用完毕 A.base=(ElemType * )malloc(elemtotal * sizeof(ElemType)); if(!A.base) exit(OVERFLOW); // 分配数组元素空间

文档评论(0)

1亿VIP精品文档

相关文档