广义表定义:
广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。
一个广义表是n(n≥0)个元素的一个序列,若n=0时则称为空表。
GL=(a1,a2,…,ai,…,an)
其中n表示广义表的长度,即广义表中所含元素的个数,n≥0。如果ai是单个数据元素,则ai是广义表GL的原子;
如果ai是一个广义表,则ai是广义表GL的子表。
习惯上用大写表示广义表的名称;用小写字母表示原子。
当广义表非空时,称第一个元素a1为GL的表头(Head),称其余元素组成的表(a2,a3,...an)是GL的表尾(Tail)。
可以发现上述广义表的定义描述时,又用到了广义表的概念;
广义表的存储结构:
广义表中的数据元素可以具有不同的结构(或是原子,或是列表)。
因此难以用顺序存储结构表示,通常采用链式存储结构。
每个数据元素可用一个结点表示。
如何设定结点的结构?由于列表中的数据元素可能为原子或列表。
因此需要两种结构的结点:一种是表结点用于表示列表,一种是原子结点用于表示原子;
若列表不空,则可以分解成表头和表尾;
一个表结点可以由3个域组成:标志域(标识是表还是原子)、指示表头的指针域、指示表尾的指针域;
对于原子结点只需要2个域:标志域、值域;
--------广义表的头尾链表存储表示--------
typedef enum {ATOM, LIST} ElemTag; //ATOM==0 原子; LIST==1 子表
typedef struct GLNode{
ElemTag tag; //公共部分,用于区分原子结点和表结点
union{ //原子结点和表结点的联合部分
AtomType atom; //atom是原子结点的值域,
struct{ struct GLNode *hp *tp}ptr; //ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
};
} *GList; //广义表类型
--------广义表的扩展线性链表存储表示--------
typedef enum {ATOM, LIST}ElemTag;
typedef struct GLNode{
ElemTag tag;
union{
AtomType atom;
struct GLNode *hp;
}
struct GLNode *tp;
} *GList;
相关链接:
广义表:https://blog.csdn.net/kong_xz/article/details/79484843
数据结构之数组和广义表:https://blog.csdn.net/z4909801/article/details/77923406