资源描述:
《数据结构 课件 第05章》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、第5章数组和广义表(Arrays&Lists)①元素的值并非原子类型,可以再分解,表中元素也是一个线性表(即广义的线性表)。②所有数据元素仍属同一数据类型。5.1数组的定义5.2数组的顺序表示和实现5.3矩阵的压缩存储5.4广义表的定义5.5广义表的存储结构数组和广义表的特点:一种特殊的线性表15.1数组的定义数组:由一组名字相同、下标不同的变量构成注意:本章所讨论的数组与高级语言中的数组有所区别:高级语言中的数组是顺序结构;而本章的数组既可以是顺序的,也可以是链式结构,用户可根据需要选择。答:对的。因为:①数组中各元素具有统一的类型;②数组元素的下标一般具有固定
2、的上界和下界,即数组一旦被定义,它的维数和维界就不再改变。③数组的基本操作比较简单,除了结构的初始化和销毁之外,只有存取元素和修改元素值的操作。讨论:“数组的处理比其它复杂的结构要简单”,对吗?2二维数组的特点:一维数组的特点:1个下标,ai是ai+1的直接前驱2个下标,每个元素ai,j受到两个关系(行关系和列关系)的约束:一个m×n的二维数组可以看成是m行的一维数组,或者n列的一维数组。N维数组的特点:n个下标,每个元素受到n个关系约束一个n维数组可以看成是由若干个n-1维数组组成的线性表。a11a12…a1na21a22…a2n…………am1am2…amnA
3、mn=3N维数组的数据类型定义n_ARRAY=(D,R)其中:Ri={
4、aj1,j2,…ji…jn,aj1,j2,…ji+1…jnD}数据关系:R={R1,R2,….Rn}数据对象:D={aj1,j2…jn
5、ji为数组元素的第i维下标,aj1,j2…jnElemset}数组的抽象数据类型定义略,参见教材P90疑问:为何书中写成i=2,…n?构造数组、销毁数组、读数组元素、写数组元素基本操作:45.2数组的顺序存储表示和实现问题:计算机的存储结构是一维的,而数组一般是多维的,怎样存放?解决办法:事先约
6、定按某种次序将数组元素排成一列序列,然后将这个线性序列存入存储器中。例如:在二维数组中,我们既可以规定按行存储,也可以规定按列存储。注意:若规定好了次序,则数组中任意一个元素的存放地址便有规律可寻,可形成地址计算公式;约定的次序不同,则计算元素地址的公式也有所不同;C和PASCAL中一般采用行优先顺序;FORTRAN采用列优先。5补充:计算二维数组元素地址的通式设一般的二维数组是A[c1..d1,c2..d2],这里c1,c2不一定是0。无论规定行优先或列优先,只要知道以下三要素便可随时求出任一元素的地址(这样数组中的任一元素便可以随机存取!):二维数组列优先存储
7、的通式为:LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*Lac1,c2…ac1,d2…aij…ad1,c2…ad1,d2Amn=单个元素长度aij之前的行数数组基址总列数,即第2维长度aij本行前面的元素个数①开始结点的存放地址(即基地址)②维数和每维的上、下界;③每个数组元素所占用的单元数则行优先存储时的地址公式为:LOC(aij)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+j-c2)]*L6例2:已知二维数组Am,m按行存储的元素地址公式是:Loc(aij)=Loc(a11)+[(i-1)*m+
8、(j-1)]*K,按列存储的公式是?Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K(尽管是方阵,但公式仍不同)例1〖软考题〗:一个二维数组A,行下标的范围是1到6,列下标的范围是0到7,每个数组元素用相邻的6个字节存储,存储器按字节编址。那么,这个数组的体积是个字节。288例3:〖00年计算机系考研题〗设数组a[1…60,1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为。8950LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L得:L
9、OC(a32,58)=2048+[(58-1)*(60-1+1)+32-1)]*2=8950答:请注意审题!利用列优先通式:答:Volume=m*n*L=(6-1+1)*(7-0+1)*6=48*6=2887Loc(j1,j2,…jn)=LOC(0,0,…0)+若是N维数组,其中任一元素的地址该如何计算?其中Cn=L,Ci-1=bi×Ci,1
10、DIM8/