概述
广义表(Generalized List),又简称作表(Lists),注意与普通列表不同,是复数的List。广义表是线性表的推广,与线性表最大的不同在于,线性表规定其中的元素是原子项,而广义表允许其中的元素自身含有结构。
定义
广义表是由 n ( n ≥ 0 ) n(n \geq 0) n(n≥0)个元素 a 0 , a 1 , … , a n − 1 a_0, a_1, \dots, a_{n-1} a0,a1,…,an−1组成的有限序列,其中元素 a i ( 0 ≤ i ≤ n − 1 ) a_i(0 \leq i \leq n-1) ai(0≤i≤n−1)可能是数据元素(也称作原子、单元素),也可能是广义表(称作子表)。广义表记作 L S = ( a 0 , a 1 , … , a n − 1 ) LS = (a_0, a_1, \dots, a_{n-1}) LS=(a0,a1,…,an−1),长度为0的广义表称为空表。
由于广义表的元素可能是原子也可能是广义表,为了区分开,规定大写字母表示广义表,小写字母表示原子。若广义表非空,则称 a 0 a_0 a0是广义表的表头(Head),其余元素组成的表称为表尾(Tail)。
广义表的深度指广义表中的层次,若 a i a_i ai是原子,则定义其深度为0,若 a i a_i ai是广义表,则其深度是表中最大深度+1,值得注意的是空表也是广义表,并其深度也是1。
从上可知,广义表的定义是递归的。
一些例子
- $A = () $ 表A是一个长度为0的空表
- B = ( e ) B = (e) B=(e) 表B只有一个原子e,其长度为1
- C = ( a , ( b , c , d ) ) C = (a, (b, c, d)) C=(a,(b,c,d)) 表C的长度为2,一个元素为原子a,另一个为子表 ( b , c , d ) (b, c, d) (b,c,d)
- $ D = (A, B, C)$ 表D的长度为3,三个元素都是子表。
- $ E = (a, E)$ 表E是一个递归的表,它的长度为2,但它可以无限的展开,因此它是无限的列表。
- F = ( ( ) ) F = (()) F=(()) 表F是一个长度为1的表,它的元素是一个空表。
另外,根据前述定义,广义表分为表头和表尾,而表尾一定是列表。值得注意的是,只有单个元素的表的表尾是空表。例如表B的表头为e,表尾为空表。
上面说到的深度在这里就可以理解为展开后括号的层数。
广义表的特点
从上面的定义和例子可以推断出广义表含有3大特点:
-
列表的元素可以是子表,子表的元素还可以是子表,由此列表是多层次结构,可以用图像表示,如下:
-
列表可为其他列表共享,例如在上述例子中,列表A,B,C是D的子表。
-
列表可以是递归的表。
存储结构
由于广义表是一种层次复杂的非线性结构,因此一般难以使用顺序存储的方式来表示,通常采用链式结构。
针对原子和子表可以分别设计不同的结点结构,如下图:
其中tag
是标志位,表示本结点存放的是什么,这个实际上还有一种实现方式包含表头,也有把表头独立的,这点上和链表差不多。其存储结构见下图:
上图来自《数据结构》人民邮电出版社 周颜军、王玉茹、关伟洲著