数据结构学习总结--串数组广义表(广义表)


广义表

定义:广义表是线性表的推广也称为列表,广义表一般记作\(LS=(a_{1},a_{2},,,,a_{n})\)
LS是广义表\((a_{1},a_{2},,,,a_{n})\)的名称,n是其长度
在广义表的定义中,\(a_{i}\)可以是单个元素也可以是广义表分别称为广义表的原子和子表,习惯上用大写字母表示广义表的名称,用小写字母表示原子
重要结论:

  1. 广义表的元素可以是子表,而子表的元素还可以是子表
  2. 广义表可以被其他广义表所共享
  3. 广义表可以是一个递归的表,即广义表也可以是其本身的子表

广义表的运算:

  1. 取表头GetHead(LS):取出表头为非空广义表的第一个元素,它可以是一个单原子也可以是一个子表
  2. 取表尾GetTail(LS):取出的表尾为除去表头之外,由其余元素构成的表即表尾一定是一个广义表

重要注意:广义表()和(()).前者为空表,长度为n;后者长度为n,可分解得到表头表尾皆为空表();
广义表的深度:深度是指有几对括号
例子:广义表((a,b,c,d))的表头是(a,b,c,d) 表尾是空表()深度是2 长度是1

广义表的存储结构

广义表通常采用链式存储结构,常用的链式存储结构有两种:头尾链式的存储结构和扩展线性链表的存储结构


由于广义表中的数据元素可能为原子或广义表,由此需要两种结构的结点:一种是广义表结点用以表示广义表,一种是原子结点用以表示原子

列表的第一种链式结构的结点

(a)表结点;(b)原子结点

表结点包含3个域:

1.标志域:tag=1,表明该结点是表结点。

2.表头指针域:hp,指向该结点表示的子表的表头。

3.表尾指针域:tp,指向该结点表示的子表的表尾。

原子结点包含2个域 :

1.标志域:tag=0,表明该结点是原子结点。

2.值域:atom,存放原子的值。

其表示方法为:任意广义表都由表头和表尾组成,所以都能用一个表结点表示。表头可能是原子,也可能是广义表。表尾一定是广义表或空表,所以能用一个表结点表示或表明其是空表。

广义表的长度:最高层的表结点个数即为广义表的长度。

 `/////------广义表的头尾链式存储表示------
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是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾

       };
    }*GList;    ///广义表类型
     `


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM