广义表(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个域表示:标志域,表头指针,表尾指针。 表头指针指向子表,表位指针指向下一个节点
举例说明