1.广义表(Generalized List)
广义表中的结点可能有两种情况
(1)单元素,需要有一个域来存储该单元素的值。
(2)广义表,需要有一个域来指向另一个链表。
对于每个结点来说,上述两个域只可能是其中的一种。所以,我们可以利用C语言中的共用体(Union)来实现这两个域的复用。
这样,广义表的数据结构可以定义如下:
typedef struct GNode *PtrToGNode;
typedef PtrToGNode GList;
struct GNode
{
int Tag; /*标志域:0表示该结点是单元素;1表示该结点是广义表*/
union
{
/*子表指针域Sublist与单元素数据域Data复用,即共用存储空间*/
ElementType Data;
GList Sublist;
}URegion;
PtrToGNode Next;
};
2.多重链表
存在结点属于多个链的链表叫"多重链表"。
例如,采用十字链表来存储稀疏矩阵,稀疏矩阵的数据结构可定义为:
typedef enum{Head,Term} NodeTag;
struct TermNode /*非零元素结点*/
{
int Row,Col;
ElementType Value;
/*结点的数据域存放元素的行坐标Row,Col*/
};
typedef struct MNode *PtrToMNode;
struct MNode /*矩阵定义结点*/
{
PtrToMNode Down,Right; /*Right为行指针(向右指针),Down为列指针(向下指针)*/
NodeTag Tag;
union
{
PtrToMNode Next; /*Next域链接头结点本身*/
struct TermNode Term;
}URegion;
};
typedef PtrToMNode Matrix;
Matrix HeadNode[MAXSIZE] /*HeadNode是为了能快速指向各行或列链表头结点的指针数组*/