关于广义表

广义表

广义表是线性表的推广和扩充,在人工智能领域中应用十分广泛。 
线性表定义为n(n≧0 )个元素a1, a2 ,…, an的有穷序列,该序列中的所有元素具有相同的数据类型且只能是原子项(Atom)。所谓原子项可以是一个数或一个结构,在结构上不可再分。若放松对元素的这种限制,容许它们具有其自身结构,就产生了广义表的概念。 
广义表(Lists,又称为列表 ):是由n(n ≧0)个元素组成的有穷序列: LS=(a1,a2,…,an) ,其中ai或者是原子项,或者是一个广义表。LS是广义表的名字,n为它的长度。若ai是广义表,则称为LS的子表。 
习惯上:原子项用小写字母,子表用大写字母。 
若广义表LS非空时: 
◆ a1(表中第一个元素)称为表头; 
◆ 其余元素组成的子表称为表尾;(a2,a3,…,an) 
◆ 广义表中所包含的元素(包括原子和子表)的个数称为表的长 度。 
◆ 广义表中括号的最大层数称为表深 (度)

广义表的元素可以是原子项,也可以是子表,子表的元素又可以是子表, …。即广义表是一个多层次的结构。表5-2中的广义表D的图形表示如图5-12所示。 
广义表可以被其它广义表所共享,也可以共享其它广义表。广义表共享其它广义表时不必列出子表的值,而是通过表名引用。如:D=(A,B,C) 
广义表本身可以是一个递归表。如:E=(a,E) 
根据对表头、表尾的定义,任何一个非空广义表的表头可以是原子,也可以是子表, 而表尾必定是广义表。(对应下面去理解

广义表通常用圆括号括起来,用逗号分隔其中的元素。
     为了区分原子和广义表,书写时用大写字母表示 广义表(名),用小写字母表示 原子
      下面是具体的书写规则。
 
      ① E=()
      E是一个空表,其长度为0。
      ② L=(a,b)
      L是长度为2的广义表,它的两个元素都是原子,因此它是一个线性表  都是原子是线性表
     ③ A=(x,L)=(x,(a,b))
      A是长度为2的广义表,第一个元素是原子x,第二个元素是子表L。
     ④ B=(A,y)=((x,(a,b)),y)
      B是长度为2的广义表,第一个元素是子表A,第二个元素是原子y。
     ⑤ C=(A,B)=((x,(a,b)),((x,(a,b)),y))
      C的长度为2,两个元素都是子表。
    ⑥ D=(a,D)=(a,(a,(a,(…))))
      D的长度为2,第一个元素是原子,第二个元素是D自身,展开后它是一个无限的广义表。

广义表的存储结构

由于广义表中的数据元素具有不同的结构,通常用链式存储结构表示,每个数据元素用一个结点表示。因此,广义表中就有两类结点: 
◆ 一类是表结点,用来表示广义表项,由标志域,表头指针域,表尾指针域组成; 
◆ 另一类是原子结点,用来表示原子项,由标志域,原子的值域组成。如下图所示。 
只要广义表非空,都是由表头和表尾组成。即一个确定的表头表尾就唯一确定一个广义表

相应的数据结构定义如下:
typedef struct GLNode
{  int   tag ;     /*  标志域,为1:表结点;为0 :原子结点  */
union
{  Atomtype atom;     /* 原子结点的值域  */
struct
    {  struct GLNode  *hp , *tp ;
     }ptr ;   /*  ptr和atom两成员共用  */
}Gdata ; 
} GLNode ;      /* 广义表结点类型  */

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值