数组
数组的顺序存储结构
由于数组一般不作插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。因此,采用顺序存储结构表示数组是自然的事了。
一、一维数组顺序存储结构
一维数组a[t]是由元素a[0],a[1],...,a[t-l]组成的有限序列,若数组的每个元素占s个存储单元,并且从地址a开始依次分配数组各元素,则分配情况为:
矩阵是科学与工程计算问题中常用的数学对象之一。
二、二维数组顺序存储结构
二维数组顺序存储有两种方式:一种是以行序为主序,另一种是以列序为主序。
1.以行序为主序进行存储分配的方法
首先存储行号为0的n个元素,对于这n个元素按列号从小到大依次存储:紧接着存储行号为1的n个元素…最后存储行号为m-1的n个元素。
地址计算
LOC(a[i][j])=LOC(a[0][0])+(i*n+j)*s=a+(i*n+j)*s
2.以列序为主序进行存储分配的方法
首先存储列号为0的m个元素,对于这m个元素按行号从小到大依次存储:紧接着存储列号为1的m个元素…最后存储列号为n-1的m个元素。
地址计算
LOC(a[i][j])=LOC(a[0][0])+(j*m+i)*s=a+(j*m+i)*s
多维数组的顺序存储
1.存放规则
以上规则可以推广到多维数组的情况:行优先顺序也称为低下标优先或左边下标优先于右边下标。具体实现时,按行号从小到大的顺序,先将第一行中元素全部存放好,再存放第二行元素,第三行元素,依次类推 ……
在BASIC语言、 PASCAL语言、 C/C++语言等高级语言程序设计中,都是按行优先顺序存放的。
列优先顺序也称为高下标优先或右边下标优先于左边下标。具体实现时,按列号从小到大的顺序,先将第一列中元素全部存放好,再存放第二列元素,第三列元素,依次类推 ……
在FORTRAN语言程序设计中,数组是按列优先顺序存放的。
按上述两种方式顺序存储的序组,只要知道开始结点的存放地址(即基地址),维数和每维的上、下界,以及每个数组元素所占用的单元数,就可以将数组元素的存放地址表示为其下标的线性函数。因此,数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。
稀疏矩阵
设矩阵Amn中有s个非零元素,若s远远小于矩阵元素的总数(即s<<m×n),则称A为稀疏矩阵。
1、稀疏矩阵的压缩存储
为了节省存储单元,可只存储非零元素。由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须存储非零元素所在的行号、列号,才能迅速确定一个非零元素是矩阵中的哪一个元素。稀疏矩阵的压缩存储会失去随机存取功能。
其中每一个非零元素所在的行号、列号和值组成一个三元组(i,j,aij),并由此三元组惟一确定。
稀疏矩阵进行压缩存储通常有两类方法:顺序存储和链式存储。链式存储方法【参见参考书目】。
2、三元组表
将表示稀疏矩阵的非零元素的三元组按行优先(或列优先)的顺序排列(跳过零元素),并依次存放在向量中,这种稀疏矩阵的顺序存储结构称为三元组表。
①三元组表表示的矩阵转置的思想方法
第一步:根据A矩阵的行数、列数和非零元总数确定B矩阵的列数、行数和非零元总数。
第二步:当三元组表非空(A矩阵的非零元不为0)时,根据A矩阵三元组表的结点空间data(以下简称为三元组表),将A的三元组表a->data置换为B的三元组表b->data。
十字链表的构成
1、非零元素的结点结构
十字链表为稀疏矩阵中的链接存储中的一种较好的存储方法,在该方法中,每一个非零元用一个结点表示,结点中除了表示非零元所在的行(row)、列(col)和值(val)的域外,还需增加两个链域:行指针域(right),用来指向本行中下一个非零元素;列指针域(down) ,用来指向本列中下一个非零元素。
2.表头结点结构
对于矩阵中每一行,分别设置一个行链表表头结点。为处理方便,使表头结点和非零元素结点结构相同,其中row和col域的值均为∞,right域指向该行非零元素的第一个结点,next(与val域共用结构中相同空间)域指向下一行的表头结点。
对于矩阵中每一列,分别设置一个列链表表头结点。dowm域指向该列非零元素的第一个结点,next域指向下一列的表头结点,其他域同行链表表头结点。