数据结构---->广义表

来源:互联网 发布:java程序员培训 编辑:程序博客网 时间:2024/05/01 22:23

广义表(List)

一、广义表定义

广义表一般记为LS=(a1,a2,…,an),其中LS是广义表(a1,a2,…,an)的名称,n是它的长度。在线性表中ai只限于单个元素,而在广义表的定义中,ai可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表。一般大写字母来表示广义表的名称,小写字母来表示广义表的原子。当广义表非空时,称第一个元素ai为LS的表头(Head),称其余元素组成的表(a2,…,an)是LS的表尾(Tail)。

(1)A=()——A是一个空表,它的长度为零

(2)B=(e)——列表B只有一个原子e,B的长度为1

(3)C=(a,(b, c, d))——列表C的长度为2,两个元素分别为原子a和子表(b, c, d)。

(4)E=(a, E)——这是一个递归的表,它的长度为2。E相当于一个无限的列表。

广义表与线性表的区别和联系?

广义表是线性表的推广,广义表中元素既可以是原子类型,也可以是列表;当每个元素都为原子且类型相同时,就是线性表。

特点:

• 有次序性     一个直接前驱和一个直接后继

• 有长度       表中元素个数,

• 有深度       表中括号的重数,

• 可递归       自己可以作为自己的子表,如A=( a , (b, A) ),此时深度为∞

• 可共享       可以为其他广义表所共享

任何一个非空列表其表头可以是原子,也可以是列表,但其表尾必定是列表。

列表()和(())不同。前者为空表,长度n=0;后者长度n=1,可以分解得到其表头、表尾均为空表()。

两种特殊的基本操作:

GetHead( L)   ——取表头(可能是原子或列表);

GetTail( L)  ——取表尾(一定是列表) 。

二、广义表的存储结构

由于广义表的元素可以是不同结构(原子或列表),难以用顺序存储结构表示,通常用链式结构,每个元素用一个结点表示。列表的“元素”还可以是列表,所以结点可能有两种形式

原子结点:表示原子,

 

表结点:表示列表,若表不空,则可分解为表头和表尾,用3个域表示:标志域,表头指针,表尾指针。  表头指针指向子表,表位指针指向下一个节点 

举例说明