2.1.4 广义表和多重链表
广义表
定义:广义表的元素不仅可以是一个单元数,还可以是另一个广义表。它是线性表的推广,线性表的n个元素都是基本的单元素。
typedef struct GNode *GList;
struct LNode{
int Tag;//标志域;1-广义表;0-单元素
union{//子表指针域SubList和单元素Data复用,即公用存储空间
int Data;
GList SubList;
}GRegion;
GList Next;//指向后继结点
}
多重链表
定义:链表中的结点可能同时隶属于多个链表。
多重链表域的指针可能有多个,如上面就有Next和SubList两个 ;但是有两个指针域的链表不一定是多重链表,比如双向链表不是多重链表。
稀疏矩阵
A
=
[
18
0
0
2
0
0
27
0
0
0
0
0
0
−
4
0
23
−
1
0
0
12
]
A=\left[ \begin{matrix} 18 & 0 & 0 & 2 & 0 \\ 0 & 27 & 0 & 0 & 0 \\ 0 & 0 & 0 & -4 & 0 \\ 23 &-1&0& 0 & 12 \end{matrix} \right]
A=⎣⎢⎢⎡1800230270−1000020−4000012⎦⎥⎥⎤
两种表示系数矩阵的方法的比较:
- 二维数组:需要事先确定数组大小,存储零项时,造成不必要的空间浪费
- 多重链表:只存储非零项:结点的数据域——行、列、值,每个结点通过两个指针域把行列串联起来。
标识域Tag表示头结点和非0结点。
Down:下指针;Right:右指针。
其中,
上图的结点是整个矩阵的入口结点,它的意思是矩阵A有4行5列7个元素。