数据结构5.3_广义表的定义和存储结构

广义表定义:

广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。

一个广义表是n(n≥0)个元素的一个序列,若n=0时则称为空表。

GL=(a1,a2,…,ai,…,an)

其中n表示广义表的长度,即广义表中所含元素的个数,n≥0。如果ai是单个数据元素,则ai是广义表GL的原子

如果ai是一个广义表,则ai是广义表GL的子表

 习惯上用大写表示广义表的名称;用小写字母表示原子。

当广义表非空时,称第一个元素a1为GL的表头(Head),称其余元素组成的表(a2,a3,...an)是GL的表尾(Tail)

可以发现上述广义表的定义描述时,又用到了广义表的概念;

 

广义表的存储结构:

广义表中的数据元素可以具有不同的结构(或是原子,或是列表)。

因此难以用顺序存储结构表示,通常采用链式存储结构。

每个数据元素可用一个结点表示。

如何设定结点的结构?由于列表中的数据元素可能为原子列表

因此需要两种结构的结点:一种是表结点用于表示列表,一种是原子结点用于表示原子;

若列表不空,则可以分解成表头表尾

一个表结点可以由3个域组成:标志域(标识是表还是原子)、指示表头的指针域、指示表尾的指针域;

对于原子结点只需要2个域:标志域、值域;

 

--------广义表的头尾链表存储表示--------

typedef enum {ATOM,  LIST} ElemTag;  //ATOM==0 原子; LIST==1 子表

typedef struct GLNode{

  ElemTag  tag;   //公共部分,用于区分原子结点和表结点

  union{   //原子结点和表结点的联合部分

    AtomType  atom;   //atom是原子结点的值域,

    struct{ struct GLNode  *hp  *tp}ptr;  //ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾

  };

} *GList;  //广义表类型

 

--------广义表的扩展线性链表存储表示--------

typedef enum {ATOM,  LIST}ElemTag;

typedef struct GLNode{

  ElemTag  tag;

  union{

    AtomType  atom;

    struct GLNode  *hp;

  }

  struct GLNode  *tp;

} *GList;

 

相关链接:

广义表:https://blog.csdn.net/kong_xz/article/details/79484843

数据结构之数组和广义表:https://blog.csdn.net/z4909801/article/details/77923406

 

posted @ 2019-02-18 17:28  Grooovvve  阅读(1611)  评论(0编辑  收藏  举报