广义表(Generalized List)是一种扩展的线性表结构,其核心在于允许表中的元素既可以是单个原子元素,也可以是子表,从而形成多层次、嵌套式的结构。以下是针对你提供内容的系统化解释:
-
核心概念
- 长度:指广义表中第一层元素的个数。例如,广义表
LS = (a, (b, c), d)的长度为 3,因为它包含三个顶层元素:a、(b, c)和d。 - 深度:指广义表中括号嵌套的最大层数。例如,
LS = (a, (b, (c, d)))的深度为 3,最内层(c, d)被嵌套了三层括号。
- 长度:指广义表中第一层元素的个数。例如,广义表
-
基本操作
- 取表头 head(LS):返回广义表的第一个元素。若第一个元素是子表,则返回该子表。例如,
head((a, b), c)返回(a, b)。 - 取表尾 tail(LS):返回除去表头后剩余元素组成的新广义表。注意,表尾始终是一个表,即使只有一个元素也需加括号。例如,
tail((a, b), c)返回(c),而tail(a, b, c)返回(b, c)。
- 取表头 head(LS):返回广义表的第一个元素。若第一个元素是子表,则返回该子表。例如,
-
主要特点
- 多层次结构:支持元素嵌套子表,实现树状或图状的数据组织。
- 共享性:多个广义表可引用同一个子表,节省存储空间并提高效率。例如,定义
A = (b, c),则B = (a, A)和C = (x, A)都共享表A。 - 递归性:广义表可以包含自身作为元素,形成递归结构。例如,
D = (a, D)表示一个无限递归的表(在实际实现中需特殊处理)。
-
存储结构
广义表通常采用链式存储结构,设计两种结点类型:- 元素结点(Atom Node):
tag = 0,表示原子元素,包含数据域data存放具体值。 - 表结点(List Node):
tag = 1,表示子表,包含两个指针:hp指向表头(第一个元素),tp指向表尾(其余元素组成的表)。
示例:广义表
LS = (a, (b, c, d))的链式结构如下:LS → [tag=1] → hp → a (atom node) tp → [tag=1] → hp → b tp → [tag=1] → hp → c tp → [tag=1] → hp → d tp → nil这种结构通过递归链接体现层次关系,清晰表达嵌套逻辑。
计算广义表(a, (b, (c, d)), e)的长度和深度需要分别分析其第一层元素个数和括号嵌套的最大层数。 - 元素结点(Atom Node):
✅ 1. 长度(Length)
定义:广义表的长度是指其最外层(即第一层)包含的元素个数。
分析广义表 (a, (b, (c, d)), e):
- 第一个元素:
a(原子) - 第二个元素:
(b, (c, d))(子表) - 第三个元素:
e(原子)
👉 最外层共有 3 个元素。
✅ 所以,长度 = 3
✅ 2. 深度(Depth)
定义:广义表的深度是其括号嵌套的最大层数。空表 () 的深度为 1,原子元素深度为 0 或 1(视定义而定),通常我们按括号层数来算。
逐步展开:
- 整体:
(a, (b, (c, d)), e)→ 第 1 层括号 - 子表
(b, (c, d))→ 第 2 层括号 - 子表
(c, d)在(b, ...)内部 → 第 3 层括号
详细结构:
Level 1: ( a , ( b , ( c , d ) ) , e )
↑ ↑ ↑
Level 2 Level 3 ←———┘
👉 最深达到 3 层括号。
✅ 所以,深度 = 3
✅ 最终结果:
- 长度 = 3
- 深度 = 3


1197

被折叠的 条评论
为什么被折叠?



