目录

  • 1. 广义表基本概念
  • 2. 广义表的存储结构
    • 2.1 头尾链表存储结构
    • 2.2 同层结点链存储结构
  • 3. 广义表的基本运算
    • 3.1 求表头、表尾
    • 3.2 求长度、深度
    • 3.3 统计原子数目
    • 3.4 广义表的复制

1. 广义表基本概念

广义表是n个数据元素(d1,d2,d3,…,dn)的有限序列,di 既可以是单个元素,也可以是一个广义表。通常记作GL =(d1,d2,d3,…,dn),n是广义表长度。若其中 di 是一个广义表,则称 di 是广义表GL的子表。在广义表GL中,d1是广义表表头,其余部分组成的表称为广义表表尾。
例如:
D=():空表,长度为0。
A=(a,(b,c)):表长度为2的广义表,第一个元素是单个数据a,第二个元素是一个子表(b,c)。
B=(A,A,D):长度为3的广义表,前两个元素为表A,第三个元素为空表D。
C=(a,C):长度为2递归定义的广义表,C相当于无穷表C=(a,(a,(a,(…))))。

① 广义表的元素可以是子表,而子表还可以是子表,因此广义表是一个多层的结构。
② 广义表可以被其它广义表共享。如广义表B共享表A,在表B中不必列出表A的内容,只要通过子表的名称就可以引用该表。
③ 广义表具有递归性,如广义表C。

2. 广义表的存储结构

2.1 头尾链表存储结构

广义表中的每一个元素用一个结点来表示,表中有两类结点:一类是单个元素结点,即原子结点;另一类是子表结点,即表结点。任何一个非空的广义表都可以将其分解成表头和表尾两部分,反之,一对确定的表头和表尾可以唯一地确定一个广义表。因此,一个表结点可由三个域构成:标志域、指向表头的指针域和指向表尾的指针域,而元素结点只需要两个域:标志域和值域。

代码

/*广义表的头尾链表存储结构*/
typedef enum { ATOM, LIST }ElemTag;     //ATOM=0,表示原子;LIST=1,表示子表
typedef struct GLNode {ElemTag tag;                     //标志位tag用来区分原子结点和表结点union {int atom;                        //原子结点的值域struct {struct GLNode* hp, * tp        //表结点的指针域htp,包括表头指针域hp和表尾指针域tp}htp;}atom_htp;                            //atom_htp是原子结点的值域atom和表结点的指针域htp的联合体域
}GLNode, * GList;

2.2 同层结点链存储结构

原子结点和表结点均由三个域构成。

代码

/*广义表的同层结点链存储结构*/
typedef enum { ATOM, LIST }ElemTag;     //ATOM=0,表示原子;LIST=1,表示子表
typedef struct GLNode {ElemTag tag;                     //标志位tag用来区分原子结点和表结点union {int atom;                        //原子结点的值域struct GLNode* hp;             //表头指针域}atom_hp;                            //atom_hp是原子结点的值域atom和表结点的表头指针域hp的联合体域struct GLNode* tp;                    //同层下一个结点的指针域
}GLNode, * GList;

3. 广义表的基本运算

3.1 求表头、表尾

/*求广义表L的表头,并返回表头指针*/
GList Head(GList L) {if (L == NULL)                   //空表无表头return NULL;if (L->tag == ATOM)             //原子不是表exit(0);elsereturn L->atom_htp.htp.hp;    //返回表头指针
}/*求广义表L的表尾,并返回表尾指针*/
GList Tail(GList L) {if (L == NULL)                   //空表无表尾return NULL;if (L->tag == ATOM)             //原子不是表exit(0);elsereturn L->atom_htp.htp.tp;    //返回表尾指针
}

3.2 求长度、深度

/*求广义表长度*/
int Length(GList L) {int k = 0;GLNode* s;if (L == NULL)return 0;                 //空表长度为0if (L->tag == ATOM)                //原子不是表exit(0);s = L;while (s != NULL) {              //统计最上层表的长度k++;s = s->atom_htp.htp.tp;}return k;
}/*求广义表的深度*/
int Depth(GList L) {int d, max;GLNode* s;if (L == NULL)return 1;                  //空表深度为1if (L->tag == ATOM)return 0;                   //原子深度为0s = L;while (s != NULL) {             //求每个子表的深度的最大值d = Depth(s->atom_htp.htp.hp);if (d > max)max = d;s = s->atom_htp.htp.tp;}return (max + 1);              //表的深度等于最深子表的深度+1
}

3.3 统计原子数目

/*统计广义表中原子结点数目*/
int CountAtom(GList L) {int n1, n2;if (L == NULL)return 0;                            //空表中没有原子if (L->tag == ATOM)return 1;                          //L指向单个原子n1 = CountAtom(L->atom_htp.htp.hp);        //统计表头中的原子数目n2 = CountAtom(L->atom_htp.htp.tp);     //统计表尾中的原子数目return (n1 + n2);
}

3.4 广义表的复制

/*复制广义表*/
int CopyGList(GList S, GList* T) {if (S == NULL) {                //复制空表*T = NULL;return OK;}*T = (GLNode*)malloc(sizeof(GLNode));if (*T == NULL)return ERROR;(*T)->tag = S->tag;if (S->tag == ATOM)(*T)->atom_htp.atom = S->atom_htp.atom;        //复制单个原子else {/*复制表头*/CopyGList(S->atom_htp.htp.hp, &((*T)->atom_htp.htp.hp));/*复制表尾*/CopyGList(S->atom_htp.htp.tp, &((*T)->atom_htp.htp.tp));}return OK;
}

参考:耿国华《数据结构——用C语言描述(第二版)》

更多数据结构内容关注我的《数据结构》专栏:https://blog.csdn.net/weixin_51450101/category_11514538.html?spm=1001.2014.3001.5482

【数据结构】广义表的存储结构及基本运算(C语言)相关推荐

  1. 不同表结构数据迁移_C语言:数据结构-广义表的存储结构

    广义表相对于线性表﹑数组﹑串等线性结构是较为复杂的结构,其元素可以具有不同的结构(可以是原子,也可以是列表),通常采用链式结构存储广义表. (1)表头.表尾链式存储 链式结构中用结点储存列表中的数据元 ...

  2. 5.4广义表的定义5.5广义表的存储结构

    广义表是线性表的推广. 广义表一般记作LS=(α1,α2,...,αn) n是它的长度αi可以是单个元素也可以说广义表,分别称为广义表LS的原子和子表. 当广义表LS非空时,称第一个元素α1为LS的表 ...

  3. 广义表的存储结构--头尾链表存储表示/扩展线性链表存储表示

    //广义表的存储结构 //1.头尾链表存储表示 typedef enum {ATOM,LIST} ElemTag;//0:原子,1:子表 typedef struct GLNode {     Ele ...

  4. 如何画出广义表的存储结构

    这部分王道书没有提到,但是自主命题的学校考过这种题,为了方便自己复习,所以写的方法比较通俗,方便理解 例:画出广义表(a,(x,y),((x)))的存储结构 分析:可以这么理解 1.一个完整的括号相当 ...

  5. 【数据结构与算法】广义表的储存结构和结点定义的Java实现

    广义表的存储结构 广义表中元素类型不统一,在Java语言的环境下难以用顺序结构存储.链式结构则相对灵活,可以解决广义表的递归和共享问题,所以常用链式存储结构来对广义表进行存储. 如果广义表不空,则可以 ...

  6. 数据结构-广义表详解(类C语言版)

    目录 广义表的概念 定义 表头 表尾 例 广义表的性质 广义表与线性表的区别 广义表的存储结构 头尾链表的存储结构 扩展线性链表的存储结构 ​ 广义表的基本运算 例 广义表的概念 定义 广义表通常记作 ...

  7. 数据结构 —— 广义表

    什么是广义表 广义表是一种非线性的数据结构,它的表元素可以是原子或者广义表的一种线性表的扩展结构. 广义表的长度:为表中最上层元素的个数 广义表的深度:为表中括号的最大层数 表头和表尾:当广义表非空时 ...

  8. 广义表及其存储方式简介

    广义表(Lists,又称列表)是线性表的推广.线性表定义为n>=0个元素a1,a2,a3,-,an的有限序列.线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个数或一个结构, ...

  9. C语言数据结构——广义表

    C语言数据结构中,广义表和数组一样,也是线性表的一种推广! 广义表的定义: 广义表 LS 为n(n≥0)个元素的有穷序列,记作: LS = (d1, d2, - dn) 其中: di:或为原子项(为具 ...

最新文章

  1. python数据挖掘试题四十道,你敢来挑战吗?
  2. Theme,skin-----asp.net2.0 new technolog
  3. poj2065 SETI
  4. SAP PP顾问面试题及资料
  5. C# 简单方式解压Zip文件/使用VS2019自带功能
  6. 前端学习(2370):组件之间的通讯方式
  7. SQLSERVER语句的执行时间
  8. java 播放m4a 文件_Javasound没有通过JAAD(SPI)播放.m4a文件
  9. Modelsim 安装步骤详解
  10. 这才是程序员该有的桌面壁纸!
  11. xss漏洞工具 -- xsser
  12. 「2021年」国内主流短信验证码平台综合评测
  13. 客房管理系统类毕业论文文献都有哪些?
  14. MWC-电机、电池螺旋桨搭配
  15. ue4 Sequencer笔记
  16. mac 重置mysql root密码_Mac下忘记Mysql root密码重置
  17. win在哪打开java_win7系统打开java控制面板的操作方法
  18. 微信小程序如何刷新当前页面或者刷新上一个页面
  19. 刀片服务器改台式电脑_一种刀片服务器机箱的制作方法
  20. 苹果手机(IOS)下载不上安装不上charles证书(不弹出下载框)终极解决办法

热门文章

  1. opening registry key Software\Javasoft\Java Runtime Environment
  2. 12306登录验证码识别(Java版)
  3. tar tar.gz
  4. 【Updating】二〇二一流水账
  5. 初中计算机word试题,初中计算机会考word试题WORD15
  6. 【docker】 docker-server启动重启关闭
  7. ULONG64转CString
  8. 小程序接入h5页面_小程序与H5如何互相跳转
  9. 多宫格视频是什么软件_怎么制作多宫格视频/九宫格视频
  10. matlab两个for循环嵌套加速,使用bsxfun加速Matlab嵌套for循环