广义表的概念及其存储

广义表(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): 求表尾
        ...
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值