前言
顾名思义,广义表就是线性表的拓展。通俗地理解,就是对于之前定义的线性表只能操作本表内的逻辑,而广义表拓宽了这个定义,于是能指向其他广义表,也就是说表与表之间建立起了联系。
概念
简单地概况广义表:表元素可以是原子也可以是一个广义表地线性表的拓展结构。
长度:最上层元素的个数,一个表可以指向其他广义表,此时其他广义表在本表中也抽象成一个元素;指向数据项也就是原子项,此时也为一个元素。
深度:其指向其他广义表的最大深度,因为其他广义表还可能再指向另外的广义表,此时求这个拓展的最大深度。注意,这里是最大深度!
定义
标记域:用于区分原子结点或者是广义表结点
数据域:用于存具体的数据
头指针域:用于指向其他广义表的指针
尾指针域:用于指向当前广义表的后继节点
原子结点
标记域+数据域
广义表结点
标记域+头指针域+尾指针域
Code
这边又两种方法,法一是不带头节点的,法二是带头节点的。
法一
typedef enum{ATOM, LIST}ElemTag; //ATOM == 0 原子;List == 1 广义表
typedef struct GLNode {
ElemTag tag;
union {
AtomDataType data;
struct {
struct GLNode *hp, *tp;
}ptr;
};
} *GList;
法二
typedef enum{ATOM, LIST}ElemTag; //ATOM == 0 原子;List == 1 广义表
typedef struct GLNode {
ElemTag tag;
union {
AtomDataType data;
struct GLNode *hp;
};
struct GLNode *tp;
} *GList;
图示
A = NULL
B = (d, e)
C = (b, (c, d))
D = (B, C)