zoukankan      html  css  js  c++  java
  • 数据结构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

  • 相关阅读:
    C#扩展方法学习
    如何用PS快速做出3D按钮效果的图片
    比较C#中几种常见的复制字节数组方法的效率[转]
    GUID的学习
    委托与事件的区别
    利用Marshal.AllocHGlobal申请非托管内存,unsafe代码
    JAVASE(十三) 异常处理
    JAVASE(十二) Java常用类: 包装类、String类、StringBuffer类、时间日期API、其他类
    JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解
    面试题: SpringBoot 的自启动原理
  • 原文地址:https://www.cnblogs.com/grooovvve/p/10396799.html
Copyright © 2011-2022 走看看