【数据结构】广义表的存储结构及基本运算(C语言)
目录
- 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语言)相关推荐
- 不同表结构数据迁移_C语言:数据结构-广义表的存储结构
广义表相对于线性表﹑数组﹑串等线性结构是较为复杂的结构,其元素可以具有不同的结构(可以是原子,也可以是列表),通常采用链式结构存储广义表. (1)表头.表尾链式存储 链式结构中用结点储存列表中的数据元 ...
- 5.4广义表的定义5.5广义表的存储结构
广义表是线性表的推广. 广义表一般记作LS=(α1,α2,...,αn) n是它的长度αi可以是单个元素也可以说广义表,分别称为广义表LS的原子和子表. 当广义表LS非空时,称第一个元素α1为LS的表 ...
- 广义表的存储结构--头尾链表存储表示/扩展线性链表存储表示
//广义表的存储结构 //1.头尾链表存储表示 typedef enum {ATOM,LIST} ElemTag;//0:原子,1:子表 typedef struct GLNode { Ele ...
- 如何画出广义表的存储结构
这部分王道书没有提到,但是自主命题的学校考过这种题,为了方便自己复习,所以写的方法比较通俗,方便理解 例:画出广义表(a,(x,y),((x)))的存储结构 分析:可以这么理解 1.一个完整的括号相当 ...
- 【数据结构与算法】广义表的储存结构和结点定义的Java实现
广义表的存储结构 广义表中元素类型不统一,在Java语言的环境下难以用顺序结构存储.链式结构则相对灵活,可以解决广义表的递归和共享问题,所以常用链式存储结构来对广义表进行存储. 如果广义表不空,则可以 ...
- 数据结构-广义表详解(类C语言版)
目录 广义表的概念 定义 表头 表尾 例 广义表的性质 广义表与线性表的区别 广义表的存储结构 头尾链表的存储结构 扩展线性链表的存储结构 广义表的基本运算 例 广义表的概念 定义 广义表通常记作 ...
- 数据结构 —— 广义表
什么是广义表 广义表是一种非线性的数据结构,它的表元素可以是原子或者广义表的一种线性表的扩展结构. 广义表的长度:为表中最上层元素的个数 广义表的深度:为表中括号的最大层数 表头和表尾:当广义表非空时 ...
- 广义表及其存储方式简介
广义表(Lists,又称列表)是线性表的推广.线性表定义为n>=0个元素a1,a2,a3,-,an的有限序列.线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个数或一个结构, ...
- C语言数据结构——广义表
C语言数据结构中,广义表和数组一样,也是线性表的一种推广! 广义表的定义: 广义表 LS 为n(n≥0)个元素的有穷序列,记作: LS = (d1, d2, - dn) 其中: di:或为原子项(为具 ...
最新文章
- python数据挖掘试题四十道,你敢来挑战吗?
- Theme,skin-----asp.net2.0 new technolog
- poj2065 SETI
- SAP PP顾问面试题及资料
- C# 简单方式解压Zip文件/使用VS2019自带功能
- 前端学习(2370):组件之间的通讯方式
- SQLSERVER语句的执行时间
- java 播放m4a 文件_Javasound没有通过JAAD(SPI)播放.m4a文件
- Modelsim 安装步骤详解
- 这才是程序员该有的桌面壁纸!
- xss漏洞工具 -- xsser
- 「2021年」国内主流短信验证码平台综合评测
- 客房管理系统类毕业论文文献都有哪些?
- MWC-电机、电池螺旋桨搭配
- ue4 Sequencer笔记
- mac 重置mysql root密码_Mac下忘记Mysql root密码重置
- win在哪打开java_win7系统打开java控制面板的操作方法
- 微信小程序如何刷新当前页面或者刷新上一个页面
- 刀片服务器改台式电脑_一种刀片服务器机箱的制作方法
- 苹果手机(IOS)下载不上安装不上charles证书(不弹出下载框)终极解决办法
热门文章
- opening registry key Software\Javasoft\Java Runtime Environment
- 12306登录验证码识别(Java版)
- tar tar.gz
- 【Updating】二〇二一流水账
- 初中计算机word试题,初中计算机会考word试题WORD15
- 【docker】 docker-server启动重启关闭
- ULONG64转CString
- 小程序接入h5页面_小程序与H5如何互相跳转
- 多宫格视频是什么软件_怎么制作多宫格视频/九宫格视频
- matlab两个for循环嵌套加速,使用bsxfun加速Matlab嵌套for循环