==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍


所谓的广义表就是单链表的扩展,就是节点可以是一个元素也可以是一个链表。官方的说法是,原子节点和子表节点。广义表用递归的方法来创建是最简单易懂的,也符合广义表的思想。

C代码实现下载
C++代码实现下载
(备用下载地址 )

1.广义表的各种形态

(1)、A = (); 空表
(2)、B = (()); 长度为1,深度为2,原子个数为0,这个实质上就是广义表中有一个元素,它是子表,该子表为空。
(3)、C = (a); 长度为1,深度为0,原子个数为1
(4)、D = (a,A,b);长度为3,深度为2,原子个数为2,其中A是一个空表。
(5)、E = (A,B,C,D);长度为4,深度为3,原子个数为3,其中ABCD都是表。
(6)、F = (a,F); 无限递归下去。

2.广义表C语言实现思路

先来看结构体定义

enum NodeType { ATOM, LIST };typedef struct _GList
{NodeType nodeType;   //节点类型union{char c;          //原子 _GList* subList; //子表};_GList* next;        //指向后继节点
}GList, *PGList;

(1)创建表
给定一个串,该串必须遵守相关规则,例如,层次分隔符用‘()’,元素分隔符用‘,’。

伪代码描述如下:

Create(PGList* gl,char* s)
{如果s="()",则(*gl)=NULL如果s='(',则递归创建子表,Create(&(*gl)->subList,s);否则创建原子节点如果s=',',则递归创建后继节点(该节点可能是ATOM或LIST)Create(&(*gl)->next,s);如果s=')',则置(*gl)->next为NULL,表示该子表已经结束如果s='\0',则置(*gl)->next为NULL,表示该广义表已经创建完成
}

重点!!! :为什么这里要传进去二级指针?刚开始我传进一级指针的时候,我发现创建完成后,gl = NULL,为什么?因为没有一个变量记录gl第一个节点的地址啊,所以最后找不到它了。这时候就需要一个二级指针,指向该头节点的地址。如图:

(2)计算广义表长度
这个就比较简单了,就和单链表一样,依次遍历第一层节点即可。
需要注意的是,因为创建广义表的时候,一开始就创建了一个子表节点,所以该节点才是广义表的头节点。

(3)计算广义表深度
递归遍历子表,取子表深度最大值。例如:(A,(B,C),(D,E,(F,G)),H)
此时最大深度在(F,G)这个子表处得到。

(4)添加原子到广义表前面或后面
这个操作和单链表的操作是一样的,广义表如果要实现更深层次的插入和添加会比较麻烦。

(5)打印广义表
一样的递归遍历,若是原子节点,则直接输出,所示子表节点,则递归进去。

2.广义表C++实现思路

广义表的节点类如下:

enum NodeType { ATOM, LIST };   //节点类型
private:class Node   //广义表结点类{public:Node(NodeType nodeType, T atom):nodeType(nodeType), atom(atom) {}private:NodeType nodeType;        //节点类型union{T atom;             //原子Node* subList;      //子表};Node* next;               //指向下一个元素friend class GList;};

和C语言类似。

只不过C++我用模板实现,这样就能存储字符、整形、浮点型了。
基本思路和C语言类似,所以,我一般都是用C语言实现了简单的功能,然后用C++封装成一个完善的类。这里省略对C++的描述,具体看代码,里面有注释。

广义表C/C++实现详解相关推荐

  1. 【数据结构Note4】-串、数组和广义表(kmp算法详解)

    文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...

  2. mybatis获取表名_mybatis plus 的动态表名的配置详解

    mybatis plus简介 详见mybatis plus的官网 业务要求 业务上要求存储数据的时候根据某个字段动态的选择数据要存储的表. 如根据code字段: code->[1001,1002 ...

  3. html中style布局放哪,CSS样式表与格式布局详解

    样式表 CSS(Cascading Style Sheets  层叠样式表),作用是美化HTML网页. 内联样式表: 例: 内联样式表 内嵌样式表:必须写在head标签里 例: p { 样式;} he ...

  4. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  5. MySQL存储引擎 lnnoDB逻辑架构 innodb存储引擎表空间(ibd文件)详解 回滚日志的物理空间

    文章目录 存储引擎 一 MySQL组织架构 二 查看存储引擎信息 三 修改存储引擎 3.1 配置文件修改存储引擎 3.2 临时修改存储引擎 3.3 建表时修改存储引擎 四 存储引擎实验 五 数据库升级 ...

  6. 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解...

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema ...

  7. Flink/Blink 原理漫谈(二)流表对偶性和distinct详解

    系列文章目录 Flink/Blink 原理漫谈(零)运行时的组件 Flink/Blink 原理漫谈(一)时间,watermark详解 Flink/Blink 原理漫谈(二)流表对偶性和distinct ...

  8. 我的世界服务器修改钟,我的世界钟合成表 钟使用方法详解

    我的世界钟合成表 钟使用方法详解.不仅在现实生活中有着钟,我的世界游戏里面也是有钟的,那下面就给大家分享一下我的世界钟怎么合成以及钟有什么用吧!希望对大家有所帮助. 游戏园我的世界官方群:325049 ...

  9. 计算机键盘五大根键,注册表五大根键详解

    <注册表五大根键详解>由会员分享,可在线阅读,更多相关<注册表五大根键详解(2页珍藏版)>请在人人文库网上搜索. 1.HKEY_CLASSES_ROOTHKEY_CURRENT ...

最新文章

  1. 讯飞智慧餐厅(安徽赛区)比赛通知
  2. luogu 3796 【模板】AC自动机(加强版)
  3. JSP/SERVLET(5)——JSP页面单选按钮操作
  4. js学习笔记(执行上下文、闭包、this部分)
  5. spark streaming 5: InputDStream
  6. Spring+Mybatis 多数据源配置
  7. 嘉实多RO150合成齿轮油
  8. HDU-1285-确定比赛名次
  9. 原型即对象(以及认识这点的重要性)
  10. Java 序列化的这三个坑千万要小心
  11. 数据库安全性概念与自主安全性机制
  12. tensorflow 入门笔记(二)
  13. Max Time-Delay Neural Networks
  14. 【Tools】常用PDF转Word工具
  15. vs2015 vc14编译libcurl
  16. java读写Txt文件
  17. java二面问什么_java面试题,拼多多面试题分享(java二面)
  18. 新年礼物送什么好?平价实用的蓝牙耳机推荐
  19. 删除在计算机的没用东西,怎么删除电脑中没用的东西?
  20. 【达摩院OpenVI】视频目标渐进式Transformer跟踪器ProContEXT

热门文章

  1. sap LICENSE KEY和 ACCESS KEY 破解
  2. C#设计模式(6)——原型模式(Prototype Pattern)
  3. 读书笔记:Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks
  4. vscode setting 配置
  5. linux crash分析案例之进程同步
  6. python int() round() floor()函数的比较
  7. PotPlayer 播放器美化设置
  8. linux平台potplayer,Daum PotPlayer不安全库加载漏洞
  9. 高校宿舍管理系统详细需求分析说明书
  10. 迁移学习(Transfer Learning)-- 概念理解