1.定义和理解
广义表是n个元素组成的有限序列 即 Ls = (a1,a2,...,an),a1称为Ls的表头,其余元素组成的表(a2,a3,...,an)称为表尾。(所以非空广义表的表尾一定是一个广义表)。 有表示习惯:大写字母表示广义表,小写字母表示单个元素。
example:
注意区分A,B
A = ( )
A称为空表, 广义表没有元素,理解上相当于集合上的空集 Ø
B = (( ))
广义表有一个元素,这个元素为空表。行当于集合上的 {Ø}
C = (a,(b,c,d))
C表有两个元素,第一个元素是原子a,第二个元素是子表
D = ( (a,b) , (c) , d , ((e,f),g))
D表有四个元素,第三个为原子,其余都是子表。
广义表示是线性表的推广,线性表要求所有元素的类型相同,广义表中允许有原子和子表两种不同的元素。
2. 存储结构
有两种较为常用的存储结构,这里介绍较为方便的一种。
采用链式结构存储广义表,需要定义原子结点和表结点。
原子结点:(用于存储原子元素)
表节点
表结点只是标志一个表的存在,其本身不存储原子元素信息
举个例子就清楚了:
C = {a,(b,c,d)} 的广义表结构如下:
结构体实现结点存储
typedef struct node
{
int tag;//0-原子结点,1-表结点
union
{
char data;//原子结点成员
struct node* head;//表结点成员
};
struct node* next;
} Node;