广义表(Lists,又称列表)是一种非连续性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。
● 一个广义表 是 n (n>=0) 个元素的一个序列
● 广义表GL的一般表示与线性表相同 :
GL = (a1,a2,..., ai, ...an)
• 若 n = 0 时 ,则称为空表
• 其中 n 表示广义表的长度 , 即广义表中所含有的元素的个数 , n>=0
• 如果 ai 是单个数据元素 , 则 ai 是广义表 GL 的原子
• 如果 ai 是一个广义表 ,则称 ai 是广义表 GL 的子表
广义表的特性:
● 广义表中的数据元素有相对次序;
● 广义表的长度定义为最外层包含的元素个数
● 广义表的深度定义为 所含括弧数的重数 , 其中原子的深度为 0 ,空表的深度为 1;
● 广义表可以共享 , 一个广义表可以为其他广义表共享 ,这种共享广义表成为再入表;
● 广义表可以是一个递归的表 :一个广义表可以是自己的子表 , 这种广义表称为递归表 , 递归表的深度是无穷值 ,长度是有限值;
● 任何一个非空广义表 GL = (a1,a2,...,an)均可分解为表头head(GL) = a1 和表尾 tail(GL) = (a2,..., an)两部分 .
● 广义表是一种递归的数据结构
例如 : F = (a, F)
广义表的表示
① 直接填充表示
A = ()
B = (e)
C = (a,(b,c,d))
D = ((),(e),(a,(b,c,d)))
E = ((a,(a,b),((a,b),c)))
② 用子表命名表示
A = ()
B = (e)
C = (a,(b,c,d))
D = (A(),B(e),C(a,(b,c,d)))
E = ((a,(a,b),((a,b),c)))
③ 用匿名子表表示
A = ()
B = (e)
C = (a,•(b,c,d))
D = ((),(e),(a,•(b,c,d)))
E = (•(a,•(a,b),•(•(a,b),c)))
④ 用图示表示把广义表里面的子表用圆圈表示 , 然后其原子用方框表示 , 通过层次划分不同深度的广义表
接下来我们定义广义表的数据结构 :
ADT
ADT GList
{
数据对象:
D = {ei | i=1,2,...,n,n>=0, ei∈AutoSet 或 GList} //AutoSet为某数据对象
数据关系:
R = {<ei-1,ei>| ei-1,ei∈D ,i=1,2,3,...,n}
数据操作:
(1) CreatGL(s): 创建广义表
(2) GLLength(L): 求广义表长度;
(3) GLDepth(L): 求广义表深度;
(4) DisGL(L): 输出广义表L;
(5) Head(L): 求表头
(6) Tail(L): 求表尾
...
}