数据结构 广义表基础

概述

广义表(Generalized List),又简称作表(Lists),注意与普通列表不同,是复数的List。广义表是线性表的推广,与线性表最大的不同在于,线性表规定其中的元素是原子项,而广义表允许其中的元素自身含有结构。

定义

广义表是由n(n0)n(n \geq 0)个元素a0,a1,,an1a_0, a_1, \dots, a_{n-1}组成的有限序列,其中元素ai(0in1)a_i(0 \leq i \leq n-1)可能是数据元素(也称作原子、单元素),也可能是广义表(称作子表)。广义表记作LS=(a0,a1,,an1)LS = (a_0, a_1, \dots, a_{n-1}),长度为0的广义表称为空表。

由于广义表的元素可能是原子也可能是广义表,为了区分开,规定大写字母表示广义表小写字母表示原子。若广义表非空,则称a0a_0广义表的表头(Head)其余元素组成的表称为表尾(Tail)

广义表的深度指广义表中的层次,若aia_i是原子,则定义其深度为0,若aia_i是广义表,则其深度是表中最大深度+1,值得注意的是空表也是广义表,并其深度也是1。

从上可知,广义表的定义是递归的。

一些例子

  1. $A = () $ 表A是一个长度为0的空表
  2. B=(e)B = (e) 表B只有一个原子e,其长度为1
  3. C=(a,(b,c,d))C = (a, (b, c, d)) 表C的长度为2,一个元素为原子a,另一个为子表(b,c,d)(b, c, d)
  4. $ D = (A, B, C)$ 表D的长度为3,三个元素都是子表。
  5. $ E = (a, E)$ 表E是一个递归的表,它的长度为2,但它可以无限的展开,因此它是无限的列表。
  6. F=(())F = (()) 表F是一个长度为1的表,它的元素是一个空表

另外,根据前述定义,广义表分为表头和表尾,而表尾一定是列表。值得注意的是,只有单个元素的表的表尾是空表。例如表B的表头为e,表尾为空表。

上面说到的深度在这里就可以理解为展开后括号的层数。

广义表的特点

从上面的定义和例子可以推断出广义表含有3大特点:

  1. 列表的元素可以是子表,子表的元素还可以是子表,由此列表是多层次结构,可以用图像表示,如下:

    数据结构 广义表基础

  2. 列表可为其他列表共享,例如在上述例子中,列表A,B,C是D的子表。

  3. 列表可以是递归的表。

存储结构

由于广义表是一种层次复杂的非线性结构,因此一般难以使用顺序存储的方式来表示,通常采用链式结构。

针对原子和子表可以分别设计不同的结点结构,如下图:

数据结构 广义表基础

其中tag是标志位,表示本结点存放的是什么,这个实际上还有一种实现方式包含表头,也有把表头独立的,这点上和链表差不多。其存储结构见下图:

数据结构 广义表基础

上图来自《数据结构》人民邮电出版社 周颜军、王玉茹、关伟洲著