广义表

 1.定义

      广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。


2.性质

      1.层次性:广义表的元素可以是子表,而子表的元素还可以是子表,由此,广义表是一个多层次的结构;
      2.共享性:广义表可为其他表所共享。
      3.递归表:广义表可以是其自身的一个子表。

(1)广义表常用表示
  ① 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自身,展开后它是一个无限的广义表。
(2)广义表的深度
一个表的"深度"是指表展开后所含括号的层数。
  【例】表L、A、B、C的深度为分别为1、2、3、4,表D的深度为∞。
(3)带名字的广义表表示
  如果规定任何表都是有名字的,为了既表明每个表的名字,又说明它的组成,则可以在每个表的前面冠以该表的名字,于是上例中的各表又可以写成:
  ①E()
  ②L(a,b)
  ③A(x,L(a,b))
  ④B(A(x,L(a,b)),y)
  ⑤C(A(x,l(a,b)),B(A(x,L(a,b)),y))
  ⑥D(a,D(a,D(…)))


/* c5-5.h 广义表的头尾链表存储表示 */
 typedef enum{ATOM,LIST}ElemTag; /* ATOM==0:原子,LIST==1:子表 */
 typedef struct GLNode
 {
   ElemTag tag; /* 公共部分,用于区分原子结点和表结点 */
   union /* 原子结点和表结点的联合部分 */
   {
     AtomType atom; /* atom是原子结点的值域,AtomType由用户定义 */
     struct
     {
       struct GLNode *hp,*tp;
     }ptr; /* ptr是表结点的指针域,prt.hp和ptr.tp分别指向表头和表尾 */
   }a;
 }*GList,GLNode; /* 广义表类型 */

                                                                                                                          

 

 

 /* c5-6.h 广义表的扩展线性链表存储表示 */
 typedef enum{ATOM,LIST}ElemTag; /* ATOM==0:原子,LIST==1:子表 */
 typedef struct GLNode1
 {
   ElemTag tag; /* 公共部分,用于区分原子结点和表结点 */
   union /* 原子结点和表结点的联合部分 */
   {
     AtomType atom; /* 原子结点的值域 */
     struct GLNode1 *hp; /* 表结点的表头指针 */
   }a;
   struct GLNode1 *tp; /* 相当于线性链表的next,指向下一个元素结点 */
 }*GList1,GLNode1; /* 广义表类型GList1是一种扩展的线性链表 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值