广义表
一、基本概念
1.定义
广义表是一种不同构的线性结构:
L
S
=
(
α
0
,
α
1
,
⋯
,
α
n
)
LS=(\alpha_0,\alpha_1,\cdots,\alpha_n)
LS=(α0,α1,⋯,αn)
其中
L
S
LS
LS是表名。
α
i
\alpha_i
αi是表中元素,它可能是原子atom(数据元素),也可能是广义表。
2.术语
- 表头:LS的第一个元素
- 表尾:其余元素组成的表
- 表长:最外层包含的元素的个数
- 深度:所含括号的重数。原子的深度为0,空表的深度为1。
3.性质
- 广义表实际是递归定义。
- 广义表中的元素可以是原子,也可以是子表。因此广义表是多层次结构。
二、广义表的头尾表示
需要两种节点:
- 表节点:存广义表
- 原子节点:存数据元素
注意:headlink指向表头,taillink指向表尾(注意表头是头元素,而表尾是余下的元素组成的表)
考虑到两种节点有公共的Tag元素,我们可以用一个联合(union)来表示。
typedef struct node {
int tag;
union {
int atom;
struct {
struct node* headlink, * taillink;
}pnode;
};
}Node;
我们通过一张图了解一下广义表头尾表示。
三、广义表的扩展线性链表表示
我们依然需要原子节点和表节点这两种节点。但与先前不同的是,两个结构体有一些变动。
原子节点:data为数据,taillink指向同一层下一个元素(何为元素?前面说过,就是可能是原子,也可能是子表)
表节点:headlink指向下一层的表头,taillink指向同层下一个元素。
还是之前那个例子,我们看一下扩展线性链表的存储图示。
<四、广义表的层次链表表示法 挖个坑,一会填>