数据结构 广义表基础

概述

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

定义

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

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

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

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

一些例子

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

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

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

广义表的特点

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

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

    GEList Tree

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

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

存储结构

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

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

GE Node

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

GE List Structure

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值