广义表
定义:广义表是线性表的推广也称为列表,广义表一般记作\(LS=(a_{1},a_{2},,,,a_{n})\)
LS是广义表\((a_{1},a_{2},,,,a_{n})\)的名称,n是其长度
在广义表的定义中,\(a_{i}\)可以是单个元素也可以是广义表分别称为广义表的原子和子表,习惯上用大写字母表示广义表的名称,用小写字母表示原子
重要结论:
- 广义表的元素可以是子表,而子表的元素还可以是子表
- 广义表可以被其他广义表所共享
- 广义表可以是一个递归的表,即广义表也可以是其本身的子表
广义表的运算:
- 取表头GetHead(LS):取出表头为非空广义表的第一个元素,它可以是一个单原子也可以是一个子表
- 取表尾GetTail(LS):取出的表尾为除去表头之外,由其余元素构成的表即表尾一定是一个广义表
重要注意:广义表()和(()).前者为空表,长度为n;后者长度为n,可分解得到表头表尾皆为空表();
广义表的深度:深度是指有几对括号
例子:广义表((a,b,c,d))的表头是(a,b,c,d) 表尾是空表()深度是2 长度是1
广义表的存储结构
广义表通常采用链式存储结构,常用的链式存储结构有两种:头尾链式的存储结构和扩展线性链表的存储结构
由于广义表中的数据元素可能为原子或广义表,由此需要两种结构的结点:一种是广义表结点用以表示广义表,一种是原子结点用以表示原子
列表的第一种链式结构的结点
(a)表结点;(b)原子结点
表结点包含3个域:
1.标志域:tag=1,表明该结点是表结点。
2.表头指针域:hp,指向该结点表示的子表的表头。
3.表尾指针域:tp,指向该结点表示的子表的表尾。
原子结点包含2个域 :
1.标志域:tag=0,表明该结点是原子结点。
2.值域:atom,存放原子的值。
其表示方法为:任意广义表都由表头和表尾组成,所以都能用一个表结点表示。表头可能是原子,也可能是广义表。表尾一定是广义表或空表,所以能用一个表结点表示或表明其是空表。
广义表的长度:最高层的表结点个数即为广义表的长度。
`/////------广义表的头尾链式存储表示------
typedef enum{ATOM,LIST} ElemTag; ///ATOM==0:原子;LIST==1:子表;
typedef struct GLNode
{ ElemTag tag; ///公共部分,用以区分原子结点和表结点
union /// 原子结点和表结点的联合部分
{
AtomType atom; ///atom是原子结点的值域,ATomType由用户定义
struct {struct GLNode *hp,*tp;} ptr; ///ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
};
}*GList; ///广义表类型
`