广义表简介
概念
广义表是n个数据元素组成的有限序列
GL是广义表的名字,n是广义表的长度.
广义表中的元素既可以是单个元素,也可以是广义表.
若di为广义表,则可称为是GL的子表.
广义表的表头:d1是广义表的表头,即广义表的第一个元素
通常,广义表中存储的单个元素称为 “原子”,而存储的广义表称为 “子表”。
广义表的表尾:广义表的GL其余部分组成的表,即(d2,d3,…,dn)为表尾
除非广义表为空表,否则广义表一定具有表头和表尾,且广义表的表尾一定是一个广义表。
广义表是递归定义的.
- A = ():A 表示一个广义表,只不过表是空的。
- B = (e):广义表 B 中只有一个原子 e。
- C = (a,(b,c,d)) :广义表 C 中有两个元素,原子 a 和子表 (b,c,d)。
- D = (A,B,C):广义表 D 中存有 3 个子表,分别是A、B和C。这种表示方式等同于 D = ((),(e),(b,c,d)) 。
- E = (a,E):广义表 E 中有两个元素,原子 a 和它本身。这是一个递归广义表,等同于:E = (a,(a,(a,…)))。
存储结构
由于广义表中既可存储原子(不可再分的数据元素),也可以存储子表,因此很难使用顺序存储结构表示,通常情况下广义表结构采用链表实现.
头尾链表存储结构
表中每个元素用一个结点表示,表中有两类结点:
- 单个元素结点
- 子表节点
任何非空的子表都可以分成表头和表尾两部分
元素节点需要值域和标志域,表结点由标志域和指向表头,表尾的指针组成
1
2
3
4
5
6
7
8
9
10typedef enum{ATOM,LIST} ElemTag;
typedef struct GLNode{
ElemTag tag;//标志域
union{
AtomType atom;//原子结点的值域
struct{
struct GLNode * hp,*tp;//表头结点指针与表尾结点
}htp;//子表结点的指针域,hp指向表头;tp指向表尾
}atom_htp;//原子值域与表结点指针域的联合体
}GLNode,*Glist;
广义表同层节点链存储结构
在这种结构中,无论是原子结点还是表结点都由三个域构成
.png)1
2
3
4
5
6
7
8
9
10typedef enum{ATOM,LIST} ElemTag;
typedef struct GLNode{
ElemTag tag;//标志域
union{
AtomType atom;//原子结点的值域
struct GLNode *hp;//子表结点的指针域,hp指向表头
};
struct GLNode * tp;//同层下一个结点的指针域
//这里的tp相当于链表的next指针,用于指向下一个数据元素
}GLNode,*Glist;
相关操作
1 |
|