欢迎来到天天文库
浏览记录
ID:59110776
大小:413.00 KB
页数:90页
时间:2020-09-25
《数据结构教程5数组和广义表ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第五章数组和广义表⒈教学内容:5.1多维数组5.2特殊矩阵的压缩存储5.3稀疏矩阵5.4广义表⒉教学目的:⑴理解多维数组的结构特点和在内存中的两种顺序存储方式;⑵理解并掌握矩阵和特殊矩阵元素在存储区中地址的计算;⑶领会稀疏矩阵的压缩方式和简单运算;⑷了解广义表的定义和基本运算。第五章数组和广义表⒊教学重点:⑴多维数组的逻辑结构;⑵多维数组的两种顺序存储方式,计算给定元素在存储区中的地址;⑶对称矩阵、三角矩阵的压缩存储方式;⑷稀疏矩阵的三元组表表示方法。⒋教学难点:稀疏矩阵的压缩存储表示下的运算的实现5.1多维数组数组的逻辑结构数组的内存映象5.1.1数组的逻辑结构数
2、组是我们熟悉的一种数据结构,可以看作线性表的推广。数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识,因此,在数组上不能做插入、删除数据元素的操作。通常在各种高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。类型特点:1)只有引用型操作,没有加工型操作;2)数组是多维的结构,而存储空间是一个一维的结构
3、。在数组中通常做下面两种操作:(1)取值操作:给定一组下标,读其对应的数据元素。(2)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。我们着重研究二维和三维数组,因为它们的应用是广泛的,尤其是二维数组。5.1.2数组的内存映象通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。对于一维数组按下标顺序分配即可。对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASC
4、AL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。有两种顺序映象的方式:1)以行序为主序(低下标优先);2)以列序为主序(高下标优先)。例如一个2×3二维数组,逻辑
5、结构可以用左图表示。以行为主序的内存映象如右图(a)所示。分配顺序为:a11,a12,a13,a21,a22,a23;以列为主序的分配顺序为:a11,a21,a12,a22,a13,a23;它的内存映象如右图(b)所示。设有m×n二维数组Amn,按元素的下标求其地址:以“以行为主序”的分配为例:设数组的基址为LOC(a11),每个数组元素占据L个地址单元,那么aij的物理地址可用一个线性寻址函数计算:LOC(aij)=LOC(a11)+((i-1)*n+j-1)*L称为基地址或基址。在C语言中,数组中每一维的下界定义为0,则:LOC(aij)=LOC(a00)+(i
6、*n+j)*L推广到一般的二维数组:A[c1..d1][c2..d2],则aij的物理地址计算函数为:LOC(aij)=LOC(ac1c2)+((i-c1)*(d2-c2+1)+(j-c2))*L同理对于三维数组Amnp,即m×n×p数组,对于数组元素aijk其物理地址为:LOC(aijk)=LOC(a111)+((i-1)*n*p+(j-1)*p+k-1)*L推广到一般的三维数组:A[c1..d1][c2..d2][c3..d3],则aijk的物理地址为:LOC(i,j)=LOC(ac1c2c3)+((i-c1)*(d2-c2+1)*(d3-c3+1)+(j-c2
7、)*(d3-c3+1)+(k-c3))*L数组元素的存储位置是其下标的线性函数。三维数组的逻辑结构和以行为主序的分配示意图如图所示。例5.1若矩阵Am×n中存在某个元素aij满足:aij是第i行中最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。基本思想:在矩阵A中求出每一行的最小值元素,然后判断该元素它是否是它所在列中的最大值,是则打印出,接着处理下一行。矩阵A用一个二维数组表示。voidsaddle(intA[][],intm,intn)/*m,n是矩阵A的行和列*/{inti,j,min;for(i=0;i
此文档下载收益归作者所有