数组与广义表
一.数组
三元组表
除了存储非零元素值 aij 之外还同时记下其所在行和列的位置 (i, j),这样组成了一个三元组 (i, j, aij)
将稀疏矩阵非零元素对应的三元组所构成的集合,按行优先顺序排列成一个线性表,称为三元组表。
稀疏矩阵可以由表示非零元素的三元组及其行列数唯一确定
三元组顺序表
- 将表示稀疏矩阵非零元素的三元组按行优先顺序排列,并依次存放在一组地址连续的存储单元里的方式称为稀疏矩阵的顺序存储结构,采用这种存储结构的稀疏矩阵称为三元组顺序表
结构体形式
#define TriList_Size 1000 // 三元组表大小,可根据实际需要而定
typedef struct
{
int row,col; // 非零元的行下标和列下标
ElemType e; // 非零元的元素值
}Triple;
typedef struct
{
Triple data[TriList_Size+1]; //非零元三元组,data[0]未用
int mu, nu, tu; //矩阵的总行数、总列数和总非零个数
} TSMatrix;
二.广义表
- 广义表,又称列表 ,是线性表的一种推广和扩充
- 在广义表中取消了对线性表元素的原子限制,允许它们具有其自身结构
- 广义表又区别于数组,不要求每个元素具有相同类型。
广义表的定义
广义表是 n (n≥0) 个元素 a1, a2, … , an 的有限序列,通常记做:
LS=(a1, a2 , … , an)
LS 是广义表名称
n 是 LS 长度
ai 是 LS 成员(直接元素),可以是单个元素,也可以是广义表,分别称为广义表 LS 的原子和子表。
重要概念:
- 当LS非空时,第一个直接元素a1称为LS的表头,其余的直接元素组成的表(a2,a3,…,an)称为LS的表尾
- LS中直接元素的个数称为LS的长度,LS中括号的最大嵌套层数成为LS的深度
任何一个非空广义表表头是表中第一个元素,它可以是原子,也可以是广义表;而其表尾必定是广义表
A = ()
因为是空表,所以不能进行取表头和取表尾的操作
B = (e)
GetHead(B) = e, GetTail(B) = ()
取表头为e,取表尾为空
C = (a,(b,c,d))
GetHead(C)= a, GetTail(C) = ((b,c,d))
取表头为a,取表尾为(b,c,d)
D =(A,B,C)
GetHead(D)= A, GetTail(D) = (B,C)
E = (())
GetHead(E)= (), GetTail(E) = ()
取表头为元素“ () ”,取表尾为空
广义表 () 和 (())不同:
()为空表,其长度为 n = 0,不能分解成表头和表尾;
(())非空表,其长度 n = 1,可分解得到其表头()、表尾()