- 1、本文档共57页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 数组 5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.3.2 稀疏矩阵 5.4 广义表的定义与存储 5.1 数组的定义 维数和维界 二维数组的类型定义: 等价于 typedef ElemType Array1[n]; typedef Array1 Array2[m]; typedef ElemType Array2[m][n]; Array2 A; 二维的数组 = 定长的线性表 a11 a12 a13 ... a1n a21 a22 a23 ... a2n Amxn= ...... am1 am2 am3 ... amn Amxn= ((a11,a12,a13,...a1n),(a21,a22,a23,...a2n),...,(am1,am2,am3,...amn)) 数组的抽象数据类型 ADT Array { 数据对象:D = {aj1j2...jn | n(0)称为数组的维数,bi是数组第i维的长度, ji是数组元素的第i维下标, aj1j2...jn∈Elemset} 数据关系: R={R1 , R2 ... Rn} Ri = {< aj1...ji...jn, aj1...ji+1...jn >|0 ≤ jk ≤ bk-1, 1 ≤ k ≤ n, aj1...ji...jn, aj1...ji+1...jn ∈D}。 基本操作: InitArray(A,n,bound1,bound2,...,boundn); DestroyArray (A); Value(A,e,index1,index2,...,indexn); Assign(A,e, index1,index2,...,indexn) }ADT Array 5.2 数组的顺序表示和实现 除了初始化和销毁之外, 数组一般只有存取操作和修改元素值的操作. 通常不作删除和插入. 行序为主序:(C语言,PASCAL, BASIC等) Amxn= (a11,a12,a13,...a1n,a21,a22,a23,...a2n,...am1,am2,am3,...amn) LOC[1,1] 为基地址: LOC[i,j] = LOC[1,1] + (n*(i-1)+j-1)*L (1=i=m, 1=j=n, 每个数据元素占L个存储单元) 例5.1: 若 L=2, LOC[1,1] = 1000 LOC[3,4] = LOC[1,1] + (5*(3-1)+4-1)*L = 1000 + 13 * 2 = 1026 LOC[0,0] 为基地址: LOC[i,j] = LOC[0,0] + (n*i+j)*L (0=im, 0=jn, 每个数据元素占L个存储单元) LOC[i,j,k] = LOC[0,0,0] + (n*h*i+ h*j + k)*L (0=im, 0=jn, 0=kh, 每个数据元素占L个存储单元) 一般n维数组的列主元存储地址计算公式 b1,b2,...,bn是n维的维界,数组元素A(j1,j2,...,jn)的存储位置为 LOC[j1,j2,...jn]= LOC[0,0,...,0] + (b2*b3*...*bn*j1 + b3*...*bn*j2 + ...... + bn*jn-1 + jn )*L n-1 n = LOC[0,0,...,0] + ( ? ji ? bk + jn)*L i=1 k=i+1 例: 在C语言中,设 数组A[5][6][7][8]的首地址为 2000, 每个元素占2个字节; 求元素A[3][4][5][4]的地址. LOC[3,4,5,4] = 2000 + (6*7*8*3 + 7*8*4 + 8*5 + 4)*2 = 2000 +
文档评论(0)