数据结构3.2线性表的推广——广义表

广义表的定义

广义表的数据元素本身也可以是一个数据结构,但与数组不同,广义表的不同元素可以有不同的结构。广义表是n个元素a1,a2,a3,…,an的有限序列,其中ai或者是原子项,或者是一个广义表。一般记为:
LS = (a1,a2,a3,…,an)
LS为广义表的名字,n为广义表的长度,若n为0,称为空表。若ai是原子型的数据元素,则称它为LS的原子;若ai是广义表,则它称为LS的子表。称第一个元素a1是LS的表头,其余元素组成的表(a2,a3,…,an)称为LS的表尾
广义表是一种递归的数据结构(在计算机编程语言中,递归类型(又名:递归定义、隐含类型或隐含定义)是一种特殊的数据类型,它表示自身内部可能包含其它的同样类型的值。)
一般用大写字母表示广义表,小写字母表示原子。例如:
1->A = ()——A是一个空表,长度为0
2->B = (e)——B是一个只有原子e的表,其长度为1
3->C = (a,(b,c,d))——C中有两个元素,一个是原子,另一个是子表,C的长度是2
4->D = (A,B,C)——D中有三个元素,每个都是子表,其长度为3
5->E = (a,E)——E中有两个元素,一个是原子,另一个是子表,E的长度是2,这是一个递归的表

特性

层次性:广义表的元素可以是子表,而子表的元素还可以是子表
共享性:广义表可为其他表所共享。例如,在上述的4中ABC为D的子表,则在D中可以不用列出其值,直接通过子表名称引用
递归性:广义表可以是其自身的一个子表
称一个广义表中括号嵌套的最大数为他的深度。如C的深度为2

基本操作

1->取表头操作head(LS)。其功能是返回广义表LS的表头
2->取表尾操作tail(LS)。其功能是返回广义表LS的表尾
由表头和表尾定义得,任何一个非空广义表其表头可能是一个原子也可能是广义表,但其表尾一定是广义表。例如:
head(A)不存在,tail(A) = ()
head(B) = e,tail(B) = ()
head© = a,tail© = ((b,c,d))
head(D) = A,tail(D) = (B,C)
head(E) = a,tail(E) = (E)
空表无表头但有表尾,其表尾为一个空表

广义表的存储

通常为链式存储结构,每个元素用一个结点表示,需要两种结构的结点:表结点和原子结点

广义表结点定义
typedef char ElemType;
typedef struct node
{int tag;//tag == 0为原子,tag == 1为子表
 union//公共部分,用于区分原子结点和表结点
 {ElemType data;//原子结点的指针域
  struct
  {struct node *hp;//hp为指向表头的指针
   struct node *tp;//tp为指向表尾的指针
  }ptr;
 }val;
}gnode;

猜你喜欢

转载自blog.csdn.net/weixin_43451616/article/details/86510326