数组是用来存储同一种数据类型的数据的一种数据结构。
1、 普通的一维数组是用来实现一些线性结构的好助手,例如我们使用的线性表的顺序存储,栈的顺序存储,队列的顺序存储,这里面都要-用到数组作为存储成部分。
2、 经过扩展的二维数组,作用将更加明显,我们使用扩展的二维数组来存储矩阵。而实际在工程的计算中矩阵的使用情况是十分普遍的。我们将用到矩阵的加减法,这些必须都要投影到二维数组上进行计算,我们一般在使用二维数组时将会使用按行优先存储。我们的教材中就会有非常明显的表现,在矩阵转置的算法中,我们就会使用到二维数组按行优先的存储,跳着顺着存时,我们会将所有的列进行遍历,到原来矩阵中某个元素的列值和现在这时for循环的列值是相等的。将这个元素存储到相应现在这个三元组表中的位置。即按列的顺序,然后按顺序存入三元组中。
3、 和数组相关的还有矩阵的压缩存储。我们平时使用的数组中有些是非常特别的,例如有些数组中仅仅只有下三角部分是一些不同的元素,其余部分全是0.这个时候,我们从节省存储空间的角度考虑,我们可以使用矩阵的压缩存储。我们使用一个一维数组来按行优先的顺序来存储这个矩阵,下三角矩阵是对称的,因此我们只在这个一维数组中存储下三角中的数据。其余
0的部分可以不存储,或者就是用一个存储单元来存储。
有以上所述,我们很自然的就想到将数组引申到矩阵的存储上来接着讨论。
    存储特殊矩阵的时候,例如我们在存储下三角矩阵的时候,我们使用的是一维数组,将下三角按照行优先的顺序存储所有的数据。在这个过程中,我们确定元素的下表是这样来的。
aij的下标是这样的:k = i*(i+1)/2+j ,现在以k做下标来存储这个元素。
矩阵的存储。
    特殊矩阵的存储我们可以使用一维数组来压缩存储。普通矩阵的存储我猜想可以直接使用二维数组了。但对稀疏矩阵的存储,我们应该使用三元组来存储。我们直接记录非零元素所在的行标和列标和元素值。很显然这将也会是一个一维数组,但是这个一维数组的数组元素不是普通的数据类型,他们是可以看成是一个个的单元格,这个单元格的特殊之处就是他们的成员有三个,行标,列标,元素值。在存储结构中除了要使用一个特殊的一维数组以外就是我们也要记录下这个稀疏矩阵的行数,列数和非零元素的个数,以便于我们后面要遍历这个三元组表时候能做个控制。
    下面是三元组表的基本存储结构:(C语言代码)
   
#define MAXSIZE 1000;
    typedef struct{
        int i,j;
        DataType v;   
    } triple;                //三元组表的基本节点
    typedef struct{
        triple data[MAXSIZE];
        int m,n,t;
    } tripletable;            //三元组表的详细组成,一个数组,三个变量。
矩阵的三元组表的存储方法书中列举的应用主要是矩阵的转置。1、跳着,顺着存。2、顺着,跳着存。这个应用有待我写代码验证。
对于矩阵的另一种奇怪的存储方法:十字链表存储法,应该是用来存储那些不大不小的矩阵的,其中的元素个数比稀疏矩阵的个数要多,但比满矩阵要少很多。一般的矩阵元素不要变动的时候,例如矩阵的转置时候可以采用三元组表来存储。但如果元素有变动。例如矩阵的加减法,这个时候可能(书上说有大量数据的变动)要使用十字链表存储。关于十字链表存储法对于矩阵存储的正真作用有待上网查资料验证。
广义表
据说广义表也是一种奇怪的线性结构。广义表是线性表的一种推广。因为广义表中的元素与线性表很相似,元素们按顺序排列在一个集合中。但与线性表不同的是广义表中的元素自身可以是一个广义表。
表头:广义表中的第一个元素(不管是原子节点还是广义表节点)是广义表的表头。
表尾:广义表除了表头之外的数组和链表其他元素所组成的广义表成为原广义表的表头。
广义表的存储形式如下:
    typedef struct GenealNode{
        Int tag;
        Union {
            DataType data;
            Struct {struct GenenalNode *hp,*tp;}ptr;//这部分不太明白什么意思
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。