|
由于广义表中的数据元素可以是原子,也可以是广义表,显然难以用顺序存储结构表示之,并且为了在存储结构中便于分辩原子和子表,令表示广义表的链表中的结点为"异构"结点,如右侧图所示,
结点中设有一个"标志域tag", 并约定 tag=0 表示原子结点,tag=1 表示表结点。原子结点中的 data 域存储原子,表结点中指针域的两个值分别指向表头和表尾。用C语言描述上述广义表的结点结构如下:
//
广义表的存储表示
typedef enum {ATOM=0, LIST=1}
ElemTag;
// ATOM(=0)标志原子,LIST(=1)标志子表
typedef struct GLNode {
ElemTag tag; //
公共部分,用于区分原子结点和表结点
union { //
原子结点和表结点的联合部分
AtomType data; //
data是原子结点的值域,AtomType由用户定义
struct {struct GLNode *hp, *tp;} ptr;
// ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
}
} *GList; //
广义表类型
例如,广义表 L=(a,(x,y),((z)) 的存储结构如右图所示。它可由对L进行表头和表尾的分析得到。
|
|
原子结点
表结点
|
|