GeneralList-广义表:

广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。

广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。

广义表结构

protected:GeneralizedNode* _head;

节点结构

struct GeneralizedNode
{GeneralizedNode(Type type=HEAD,char value=0):_type(type),_next(NULL){if(_type==VALUE){_value=value;}else if(_type==SUB){_sublink=NULL;}}Type _type;GeneralizedNode* _next;union//联合(共用体){GeneralizedNode* _sublink;char _value;};
};

利用联合来实现不同节点的成员不同

enum Type
{HEAD,VALUE,SUB,
};

构造函数:构造函数调用_CreateList函数

GeneralizedNode* _CreateList(const char*& str)//加引用避免子表递归返回时str跳到递归之前的位置{assert(str&&*str=='(');GeneralizedNode* head=new GeneralizedNode(HEAD);GeneralizedNode* cur = head;++str;while(*str){if(IsValue(*str)){cur->_next=new GeneralizedNode(VALUE,*str);cur=cur->_next;++str;}else if(*str=='('){cur->_next=new GeneralizedNode(SUB);cur=cur->_next;cur->_sublink=_CreateList(str);}else if(*str==')'){++str;return head;}else{++str;//遇见其他字符直接跳过}}assert(false);return head;}

析构函数:调用_Destroy

void _Destory(GeneralizedNode* head){GeneralizedNode* cur=head;while(cur){GeneralizedNode* del=cur;//记录要删除的节点if(cur->_type==SUB){_Destory(cur->_sublink);//递归的条件:遇到SUB类型的节点}cur=cur->_next;delete del;}}

打印函数:调用_Print

void _Print(GeneralizedNode* head){GeneralizedNode* cur=head;while(cur){if(cur->_type==HEAD)//遇到头结点,打印前括号{cout<<"(";}else if(cur->_type==VALUE){cout<<cur->_value;if(cur->_next)//当前value节点后面不为空,打印逗号{cout<<",";}}else {_Print(cur->_sublink);//递归的条件:遇到SUB类型的节点if(cur->_next)//子表递归返回时的next不为空{cout<<",";}}cur=cur->_next;}cout<<")";//表遍历完成之后,打印表的后括号}

求广义表的size:调用_Size

size_t _Size(GeneralizedNode* head){GeneralizedNode* cur=head;size_t size=0;while(cur){if(cur->_type==VALUE)//遇到value,size++{ ++size;}else if(cur->_type==SUB){size+=_Size(cur->_sublink);//递归的条件:遇到SUB类型的节点}cur=cur->_next;}return size;}

求广义表的深度:调用_Depth

size_t _Depth(GeneralizedNode* head){size_t index=1;//广义表为空时,深度为1GeneralizedNode* cur=head;while(cur){if(cur->_type==SUB){size_t subDepth=_Depth(cur->_sublink);//递归的条件:遇到SUB类型的节点if(subDepth+1>index)//更新深度{index=subDepth+1;}}cur=cur->_next;}return index;}

拷贝构造函数:调用_Copy

GeneralizedNode* _Copy(GeneralizedNode* head){assert(head->_type==HEAD);//传入的是头结点才正确GeneralizedNode* newhead=new GeneralizedNode(HEAD);//构造新广义表的头结点GeneralizedNode* cur=head->_next;GeneralizedNode* newcur=newhead;while(cur){if(cur->_type==VALUE){newcur->_next=new GeneralizedNode(VALUE,cur->_value);newcur=newcur->_next;}else if(cur->_type==SUB){newcur->_next=new GeneralizedNode(SUB);newcur=newcur->_next;newcur->_sublink=_Copy(cur->_sublink);//递归进入子表//递归的条件:遇到SUB类型的节点}cur=cur->_next;}return newhead;}

赋值操作符的重载(采用现代写法)

Generalized& operator=(Generalized g)//现代写法{swap(_head,g._head);return *this;}

转载于:https://blog.51cto.com/lovemeright/1765692

GeneralList-广义表相关推荐

  1. c++数据结构之广义表

    最近学习了广义表,我们知道广义表也是一种线性表,而顾名思义广义表就是不止一个表,下面来举个栗子: A=( ) B=(1 , 2,3) C=(1 ,2 ,3, ( a , b ,c) ) D=(1, 2 ...

  2. 数据结构之【数组和广义表】复习题

                          第 4  章  数组和广义表 一.选择题 1. 将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元素A666 ...

  3. Java数据结构和算法:字符串、数组和广义表

    数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...

  4. 第八周实践项目9 算法库——广义表

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目9- *作 者:邵雪源 *完成日期:2017年12月14日 *版 ...

  5. java 广义表_数据结构:广义表的实现(Java)

    Java实现广义表: package 广义表; import java.util.Stack; public class Test { public final int TAG_TABLE = 1; ...

  6. 十六、广义表的建立与基本操作

    十六.广义表的建立与基本操作 文章目录 十六.广义表的建立与基本操作 题目描述 解题思路 上机代码 补充说明 题目描述 采用"头尾法存储广义表,实现以下广义表的操作: 1.Status Cr ...

  7. 数据结构----数组与广义表专题

    数组与广义表专题 数组的顺序表示和实现 前言 数组中任意一个元素存储地址的计算 一维数组 二维数组 更一般的二维数组 矩阵的压缩存储 前言 对称矩阵 三角矩阵 前言 上三角对应关系 下三角关系 三对角 ...

  8. 【数据结构】数组和广义表

    感觉数组这一段没讲什么太多的东西. 先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外.操作只有初始化 销毁 取元素 修改元素.然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 ...

  9. 【数据结构总结】第四章:串、数组和广义表(线性结构)

    第四章:串.数组和广义表(线性结构) 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅 ...

  10. java 广义表_java 输入广义表 生成二叉树 | 学步园

    今天我要分享我学习用广义表生成二叉树的代码 这里我参考了  张二青博主的一些知识 http://my.csdn.net/zhangerqing 下面我进行分析了  比如输入广义表  (有关字符串的定义 ...

最新文章

  1. 四款 5G 版 iPhone 12 齐发,支持北斗系统,你准备好了吗?
  2. ADF Jar包循环引用会出问题
  3. hdu 5285(染色法判断二分图)
  4. mysql 导出用户权限_MySQL中导出用户权限设置的脚本分享
  5. spring boot apollo demo
  6. Erlang OTP学习(3) supervisor
  7. bootstrap综合大作业_齐齐哈尔市克东县城市管理综合执法局昼夜奋战清冰雪,全力以赴保畅通...
  8. Sharepoint学习笔记—Site Definition系列-- 3、创建ListDefinition
  9. 【转载保存】索引文件锁LockFactory
  10. VMware vRealize Operations Manager SSRF漏洞(CVE-2021-21975、SSRF)
  11. 腾讯回应租号打游戏:已向超20家账号交易平台发函
  12. 8 定制10MINs 3
  13. java视频教程下载
  14. 微积分-指数函数求导
  15. win10设置桌面图标间距
  16. nodejs+Vue+Elementui的校园二手旧书交易交换平台sequelize
  17. 基于无线信号的手势识别研究现状调查
  18. ddr布线 pads_[转载]Pads Router布线技巧,等长,蛇线,差分
  19. 数据可视化项目---订单分类占比图
  20. 从零学习 InfiniBand-network架构(九) —— IB协议中子网本地地址

热门文章

  1. overflow超出显示_实现:超过N行折叠并显示“...查看全部”【功能】
  2. 幼儿园 php,input.php
  3. java8安装_JMeter必知必会系列(2) JMeter安装部署
  4. mysql+表复制+效率_MySQL数据库复制表的几种方式讲解
  5. dgi数据治理_荐书 | 5G时代组织急需数据体检
  6. c语言运行时更入下一行,C语言高级语言程序设计(一)_第二章 C程序设计基础(二).ppt...
  7. java math rint_Java Math.rint() 方法
  8. java连接摄像头_Java实现 海康摄像头抓拍图像(示例代码)
  9. mysql的join算法_mysql的Join算法-阿里云开发者社区
  10. 物理搬砖问题_搬砖姿势:风法