3.2.4 广义表与多重链表

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是为了能快速指向各行或列链表头结点的指针数组*/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值