1.广义表的定义
顾名思义,广义表是线性表的推广,也称为列表。
用大写字母表示广义表的名称,用小写字母表示原子
(l) A = ()----------A是一个空表, 其长度为零。
(2) B=(e)--------B 只有一个原子 e, 其长度为1。
(3) C= (a, (b, c, d))-------C的长度为2, 两个元素分别为原子 a 和子表(b,c, d)。
(4) D = (A, B, C)---------D的长度为3,3个元素都是广义表。显然,将子表的值代入后,则有
D = ((), (e), (a, (b, c, d))) 。
(5) E = (a, E)—这是一个递归的表, 其长度为2。E 相当千一个无限的广义表 E=(a, (a,(a, ···)))。
从上述定义和例子可推出广义表的如下3个重要结论。
(1) 广义表的元素可以是子表,而子表的元素还可以是子表……由此,广义表是一个多层次
的结构,可以用图形象地表示。例如,图4.14表示的是广义表D, 图中以圆圈表示广义表,以方块表示原子。
(2) 广义表可为 其他广义表所共享。例如在上述例子中,广义表A、 B 和 C为 D 的子表,
则在D中可以不必列出子表的值,而是通过子表的名称来引用。
(3) 广义表可以是一个递归的表,即广义表也可以是 其本身的一个子表。例如,表E 就是一
个递归的表。
由于广义表的结构比较复杂,其各种运算的实现也不如线性表简单,其中,最重要的两个运算如下。
(1) 取表头 GetHead(LS): 取出的表头为非空广义表的第一个元素,它可以是一个单原子,也 可以是一个子表。
(2) 取表尾 GetTail(LS): 取出的表尾为除去表头之外,由其余元素构成的表。即表尾一定是
一个广义表。
2.广义表的存储结构
由于广义表中的数据元素可以有不同的结构(或是原子,或是列表),因此难以用顺序存储结 构表示,通常采用链式存储结构
1. 头尾链表的存储结构
由于广义表中的数据元素可能为原子或广义表,由此需要两种结构的结点:一种是表结点, 用以表示广义表; 一种是原子结点, 用以表示原子。从上节得知:若广义表不空,则可 分解成表头和表尾, 因此, 一对确定的表头和表尾可唯一确定广义表。
一个表结点可由3个 域组成:标志域、指示表头的指针域和指示表尾的指针域。
而原子结点只需两个域:标志域 和值域。如图4.15所示, 其中tag是标志域, 值为1时表明结点是子表, 值为0时表明结点是原子。
2. 扩展线性链表的存储结构
在这种结构中, 无论是原子结点还是表结点均由三个域组成