6.1 数组
数组是具有相同类型的数据结构的有限序列,可以将它看作是线性表的推广。
数组跟数组类型的区别:
前者可以借助后者来存储,像线性表的顺序存储结构(即顺序表)就是一种借助一维数组这种数据类型来存储的。但二者不能混淆。
存储地址
一维数组
LOC( ai ) = LOC( ac ) + ( i-c ) * k ,( c <= i <= n )
二维数组
按行优先存放:
LOC( ai,j ) = LOC( ac1,c2 ) + ( ( i - c1 ) * ( d2 - c2 + 1 ) +( j - c2 ) ) * k , (c <= i <= n)
按行优先存放:
LOC( ai,j ) = LOC( ac1,c2 ) + ( ( j - c2 ) * ( d1 - c1 + 1 ) + ( i - c1 ) ) * k , (c <= i <= n)
特殊矩阵的压缩存储
特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵,为了节省存储空间,特>别是在高阶矩阵的情况下,可以利用特殊矩阵的规律对它们进行压缩存储,以提高>存储空间效率。
特殊矩阵的主要形式有:
(1)对称矩阵
(2)上三角矩阵/下三角矩阵
(3)对角矩阵
它们都是方阵,即行数和列数相同。
6.2 稀疏矩阵
稀疏矩阵是一种特殊的二维数组。
一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t十分小时,
即 s《《 t 时,称该矩阵为稀疏矩阵。
稀疏矩阵和特殊矩阵的不同点:
- 特殊矩阵的特殊元素(值相同元素、常量元素)分布有规律。
- 稀疏矩阵的特殊元素(非0元素)分布没有规律。
稀疏矩阵的三元组表示
define MaxSize 100 //矩阵中非零元素最多个数
typedef struct {
int r; //行号
int c; //列号
ElemType d; //元素值
} TupNode; //三元组定义
typedef struct
{ int rows; //行数值
int cols; //列数值
int nums; //非零元素个数
TupNode data[MaxSize];
} TSMatrix; //三元组顺序表定义稀疏矩阵的十字链表表示
6.3 广义表
广义表也可以看成是线性表的推广,它是采用递归方法定义的。
- GL=(a1,a2,…,ai,…,an)
- 若n=0时称为空表
- ai为广义表的第i个元素。如果ai属于原子类型,称之为广义表GL的原子
- 如果ai又是一个广义表,称之为广义表GL的子表