【数据结构】广义表

数据结构C语言——广义表 很久没有发博客记录了,不过应该也没人关心这个,哈哈哈。 突然想起来,学习也不能只是干学,稍微做点记录。 之前我对html、css、js基础有了一定的理解,也学了一些模板,不过现在我想先把计算机基础给补上,所以把数据结构理一理! 近在学习数据结构C语言版,有一些心得,跟大家分享一下 可能会有很多比较基础的知识,大佬勿喷! ok,我现在在学习广义表的结构,前边学的其他数据结构我后边会找时间在整理一下。下边是我对广义表的一些理解,大家可以适当的参考一下,如果方便的话,也麻烦帮我指出不足之处,给我这个想要继续往上的 阅读详情

一、广义表的定义

  

     广义表简称表,它是线性表的推广。一个广义表是n(n>=0)个元素的一个有限序列,当n=0时称为空表。在一个非空的广义表中,其元素可以是某一确定类型的对象,这种元素被称为单元素;也可以是由单元素构成的表,这种元素被称为子表或表元素。显然,广义表的定义是递归的,广义表是线性表的递归数据结构。

        社ai为广义表的第i个元素,则广义表的一般表示与线性表相同。

        (a1,a2,a3,a4......,an)

        其中,n表示广义表的长度,即广义表中所含元素的个数,n>=0。

        同线性表一样,也可以用一个标识符来命名一个广义表,例如:用LS命名上面的广义表,则为:LS(a1,a2,a3...an+1,an)。在广义表的讨论中,为了把单元素同表元素区别开来,一般用小写字母表示表元素,用大写字母表示表,例如:A=()

                                           B=(e)

                                           C=(a,(b,c,d))

                                           D=(A,B,C)=((),(e),(a,(b,c,d)))

                                           E=((a,(a,b),((a,b),c)))

       其中,A是一个空表,不含任何元素,其长度为0;B是一个只含有单元素e的表,其长度为1;C中有两个元素,第1个元素是单元素a,第2个元素是表元素(a,b,c),C的长度为2;D中有3个元素,其中每个元素又都是一个表,D的长度为3;E中只含有一个元素,该元素是一个表,该表中含3个元素,其中后两个元素又都是表。

        一个广义表的深度是指该表中括号嵌套的最大重数,在图像中则是值从树根节点到每个表元素结点所经过的结点个数的最大值。


二、广义表的存储结构

        广义表是一种递归的数据结构,因此很难为每个广义表分配固定大小的存储空间,所以其存储结构只好采用动态链接结构。

        广义表中的结点类型可定义为:

  1. public class GeneralizedNode { //假定用GeneralizedNode来表示广义表中的结点类
  2. boolean tag; //结点标志域
  3. Object data; //结点值域
  4. GeneralizedNode sublist; //指向子表的引用域
  5. public GeneralizedNode(boolean tag, Object data, GeneralizedNode sublist) {
  6. this.tag = tag;
  7. this.data = data;
  8. this.sublist = sublist;//利用每个参数分别给相应成员赋值
  9. }
  10. }

       当一个结点的标志域tag的取值为false时,表明它是一个单元素结点,此时结点值域data和后继链接域next有效,而子表的链接(表头指针)域sublist无效;相反,当tag域的取值为true时,则表明它是一个表元素(子表)结点,此时指向子表的链接域sublist和指向后继结点的链接域next有效,而结点的值域data无效。在广义表的链接存储结构中,通过表结点中的sublist域,保存其子表中第1个元素结点的引用,实现向下一层子表的链接;通过每个结点中的next域,保存其后继结点的引用,实现向同层次的后继结点的链接。


三、广义表类的定义

        在广义表类的定义中,应包含数据成员和方法成员,数据成员一般是私有的,以体现类和对象的隐藏性,方法成员若被被提供作为外部调用的接口,则应是非私有的,若只提供给内部的方法所调用,则应是私有的。

       广义表是线性表的递归结构,它的链接存储结构也是单链表的递归结构,所有对它进行的各种运算方法必然也是递归的。

       当类中的一个方法需要递归实现时,必须另外定义一个驱动方法,该方法是一个非递归方法,方法体中只包含一条调用递归方法的语句。驱动方法的功能有两个:一是提供给外部的类和对象调用,所有它通常具有公有的访问属性;二是调用同名的递归方法,实现运算的功能,递归方法只需要提供给本类使用,不需要提供给外部使用,所有通常被定义为私有访问属性。

3.1 求广义表的长度

      在广义表 中,同一层次的每个结点是通过next域链接起来的,所有它是由next域链接起来的单链表。这样,求广义表的长度就是求单链表的长度,可以采用重复循环,从头到尾依次访问单链表中的每个结点,并进行已访问结点个数的统计,则能够求出单链表的长度,亦即广义表的长度。

  1. private int length(GeneralizedNode glt) //求广义表长度的递归函数
  2. {//求出表头指针glt所指向的广义表的长度,glt初始指向广义表的第1个结点
  3. if(glt!=null) //若glt不为空,其长度等于1加上后继表的长度
  4. {
  5. return 1+length(glt.next);
  6. }
  7. else //若glt为空,其长度等于0
  8. return 0;
  9. }

3.2 求广义表的深度

       广义表深度的递归定义是它等于所有子表中表的最大深度加1。若一个表为空或仅由单元素所组成,则深度为1,它是结束向下继续递归求深度的终止条件。设dep表示任一子表的深度,max表示所有子表中的最大深度,depth表示广义表的深度,则有depth=max+1

       当一个表不包含任何子表时,其深度为1,所以在算法中max的初值应为0,返回max+1的值1就正好等于此时表的深度。

  1. private int depth(GeneralizedNode glt) //求广义表深度的递归函数
  2. {//求出表头指针glt所指向的广义表的深度,glt初始指向广义表的第1个结点
  3. int max=0; //给max赋初值0
  4. while(glt!=null) //遍历表中每一个结点
  5. {
  6. if(glt.tag==true)
  7. {
  8. int dep=depth(glt.sublist);//递归调用求出子表的深度
  9. if(dep>max)
  10. max=dep; //让max为同层求过子表深度的最大值
  11. }
  12. glt=glt.next; //使表头指针指向同一层的下一个结点
  13. }
  14. return max+1;
  15. }

     下面给出广义表类的具体定义:

  1. public class GeneralizedList { //广义表类的定义
  2. private GeneralizedNode head; //广义表结点引用域
  3. private int i=0; //此变量i为建立广义表create方法所使用
  4. public GeneralizedList() //广义表的构造方法,创建一个空的表结点
  5. { //表结点的tag域为true,其余为空值
  6. head=new GeneralizedNode(true,null,null,null);
  7. }
  8. public int length() //求广义表长度的驱动方法
  9. {
  10. return length(head.sublist); //以表结点的子表引用域为参数调用递归函数
  11. }
  12. private int length(GeneralizedNode glt) //求广义表长度的递归函数
  13. {//求出表头指针glt所指向的广义表的长度,glt初始指向广义表的第1个结点
  14. if(glt!=null) //若glt不为空,其长度等于1加上后继表的长度
  15. {
  16. return 1+length(glt.next);
  17. }
  18. else //若glt为空,其长度等于0
  19. return 0;
  20. }
  21. public int depth() //求广义表深度的驱动方法
  22. {
  23. return depth(head.sublist); //以表结点的子表引用域为参数调用递归函数
  24. }
  25. private int depth(GeneralizedNode glt) //求广义表深度的递归函数
  26. {//求出表头指针glt所指向的广义表的深度,glt初始指向广义表的第1个结点
  27. int max=0; //给max赋初值0
  28. while(glt!=null) //遍历表中每一个结点
  29. {
  30. if(glt.tag==true)
  31. {
  32. int dep=depth(glt.sublist);//递归调用求出子表的深度
  33. if(dep>max)
  34. max=dep; //让max为同层求过子表深度的最大值
  35. }
  36. glt=glt.next; //使表头指针指向同一层的下一个结点
  37. }
  38. return max+1;
  39. }
  40. public Object find(Object obj) //从当前广义表中查找值为obj的结点
  41. {
  42. return find(head,obj); //此为调用递归函数的驱动方法
  43. }
  44. //以整个广义表结点的引用和obj作为参数
  45. private Object find(GeneralizedNode glt,Object obj)
  46. { //从当前广义表中查找值为obj的递归方法,glt初始指向整个广义表的表结点
  47. while(glt!=null) //处理广义表中的每个结点
  48. {
  49. if(glt.tag==false) //处理单元素结点
  50. {
  51. if(glt.data.equals(obj))
  52. {
  53. return glt.data; //查找成功返回结点值
  54. }
  55. else
  56. glt=glt.next; //否则继续向后继结点查找
  57. }
  58. else //处理表元素结点
  59. {
  60. Object x=find(glt.sublist,obj);//在子表中查找,结果存入x中
  61. if(x!=null)
  62. {
  63. return x; //在子表中查找成功返回结点值
  64. }
  65. else
  66. {
  67. glt=glt.next; //否则继续向表结点的后继结点查找
  68. }
  69. }
  70. }
  71. return null; //没有从表中找到应返回空值
  72. }
  73. public void output() //输出当前广义表的驱动方法
  74. {
  75. output(head); //以整个广义表结点的引用作为调用实参
  76. }
  77. private void output(GeneralizedNode glt)//输出广义表的递归函数
  78. {
  79. //以广义表的书写格式输出广义表glt,glt初始指向整个广义表的表结点
  80. if(glt.tag==true) //对表结点进行处理
  81. {
  82. System.out.print("("); //先输出左括号,作为表的开始符号
  83. if(glt.sublist==null) //若子表引用为空,则输出‘#’字符表示空表
  84. {
  85. System.out.print("#");
  86. }
  87. else //当一个子表输出结束后,应输出右括号作为终止符
  88. output(glt.sublist);
  89. System.out.print(")"); //对于单元素结点,输出该结点的值
  90. if(glt.next!=null) //处理后继表
  91. {
  92. System.out.print(","); //先输出逗号分隔符
  93. output(glt.next); //再递归输出后继表
  94. }
  95. }
  96. }
  97. public void create(String s) //根据字符串s中保存的广义表建立其存储结构
  98. {
  99. create(head,s); //此为调用同名递归函数的驱动方法
  100. }
  101. private void create(GeneralizedNode glt,String s)
  102. { //以整个广义表的引用和字符串s作为参数
  103. //建立广义表存储结构的递归函数,glt初始指向整个广义表的表结点
  104. char ch='\0';
  105. //利用ch读取一个字符,循环结束后ch读取的只可能是左括号、英文字母或#字符
  106. while((ch=s.charAt(i))==' ')
  107. {
  108. i++; //忽略掉空格
  109. }
  110. //若读取的为左括号则建立由glt.sublist所指向的子表并递归构造子表
  111. if(ch=='(')
  112. {
  113. glt.sublist=new GeneralizedNode(true,null,null,null);//初始为表结点
  114. i++;
  115. create(glt.sublist,s); //递归建立子表
  116. if(s.charAt(i)=='#') //若子表为空表,则修改子表域为空
  117. {
  118. while((ch=s.charAt(++i))==' ')//忽略空格
  119. {
  120. if(ch==')')
  121. {
  122. glt.sublist=null; //修改子表域为空
  123. }
  124. else
  125. {
  126. illegalChar(); //处理非法字符
  127. }
  128. }
  129. }
  130. //若读取的为字符元素,则修改初始建立的表结点为现在的单元素结点
  131. else if(ch>='a' && ch<='z')
  132. {
  133. glt.tag=false; //修改为单元素结点
  134. String str = String.valueOf(ch);
  135. glt.data=str; //给数据域赋值
  136. }
  137. //若读取的为表示空的井字符,则返回到上面的递归建立子表的语句之后
  138. else if(ch=='#') return;
  139. //ch所读取的字符必为非法字符,应显示错误信息并退出运行
  140. else illegalChar();
  141. i++; //处理一个子表或元素后,使指示处理字符位置的i值增1
  142. //空格被跳过,循环结束后,ch读取的字符必为逗号、右括号或分号
  143. while((ch=s.charAt(i))==' ')
  144. {
  145. i++; //忽略掉空格
  146. }
  147. //若读取的为逗号则递归构造后继表
  148. if(ch==',')
  149. {
  150. glt.next=new GeneralizedNode(true,null,null,null);//初始为表结构
  151. i++; //使指示处理字符位置的i值增1,以便处理下一个子表或单元素
  152. create(glt.next,s); //递归调用构造后继表
  153. }
  154. //若读取的为右括号或分号表明相应的子表或整个表处理完毕,则不做任何事情,自然结束
  155. else if(ch==')'||ch==';');
  156. //所读取的字符必为非法字符,应显示错误信息并退出运行
  157. else illegalChar();
  158. }
  159. }
  160. private void illegalChar() //在create算法中,调用此方法处理非法字符
  161. {
  162. System.out.println("广义表字符串中存在非法字符,终止运行!");
  163. System.exit(1);
  164. }
  165. public void clear() //清除广义表中的所有元素,使之成为空表
  166. {
  167. head.sublist=head.next=null;
  168. }
  169. }
数据结构学习笔记——广义表 广义表是线性表的进一步推广,是由n(n≥0)个数据元素组成的有序序列。线性表中的数据元素只能是单个元素(原子),它是不可分割的,而广义表中的数据元素既可以是原子,也可以是一个广义表(包括空表和非空表),广义表通过圆括号“()”括起来,通过逗号“”隔开表中的各个数据元素。一个n维数组可以看成元素是n-1维数组的广义表,广义表的元素都是n-1维数组。另外,若广义表中的所有元素都是原子时,此时的广义表就是一个线性表。广义表H=((a,b),(c,(d,e))),括号层数为3,所以广义表的深度为3,最高层为(c,( 阅读详情

相关推荐

9. 广义表 - 广义表概念,存储结构,深度/长度,复制算法

文章目录9. 广义表9.1 广义表的基础概念9.2 广义表的存储结构9.3 广义表的深度和长度9.3.1 广义表的长度9.3.2 广义表的深度9.4 广义表的复制 9. 广义表 9.1 广义表的基础概念 1 )什么是广义表 广义表,又称列表,也是一种线性存储结构,既可以存储不可再分的元素,也可以存储广义表,记作:LS = (a1,a2,…,an),其中,LS 代表广义表的名称,an 表示广义表存储的数据,广义表中每个 ai 既可以代表单个元素,也可以代表另一个广义表。 2 )广义表的原子和子表 广义表

园长QwQ 5万+

数据结构 第四章 广义表

4.5 广义表 4.5.1广义表的定义 广义表是线性表的推广,也称列表。广泛地用于人工智能等领域的表处理语言LISP语言,把广义表作为基本的数据结构,就连程序也表示为一系列的广义表。 广义表一般记作,其中可以是单个元素,也可以是一个广义表。广义表的定义是一个递归的过程,相当于单个元素可以是广义表,这个广义表内的元素又可以有广义表...... 下面我们列举一些广义表的例子。 1)A=( ),A是一个空表,其长度为0。 2)B=(e),B只有一个元素, ...

weixin_62917800的博客 6496

《数据结构》第4章 串、数组和广义表

《数据结构》第4章 串、数组和广义表第4章 串、数组和广义表 第4章 串、数组和广义表 第一块:引入 什么叫数据结构?为什么这是一门问题驱动型学科? 第二块:问题 逻辑结构+存储结构+操作 第三块:应用 到底能解决什么问题? 第四块:拓展 能否将非线性和线性进行一个统一? ...

kingloveccc的博客 2728

数据结构-广义表

广义表又称列表,也是一种线性存储结构,通数组类似,广义表中即可存储不可再分的元素也能存储可在分元素。例如:数组中可以存储‘a’、3这样的字符或数字,也能存储数组,比如二维数组、三维数组,数组都是可在分成子元素的。广义表也是如此,但与数组不同的是,在广义表中存储的数据是既可以再分也可以不再分的,形如:{1,{1,2,3}}。如果创建一个二维数组来存储{1,{1,2,3}}。在存储上确实可以实现,但无疑会造成存储空间的浪费。广义表记作:其中,LS 代表广义表的名称,an 表示广义表存储的数据。...

有朋自远方来,不亦乐乎。 1万+

【数据结构】广义表的实现

【前言】学完了顺序表,链表这些线性的数据结构,现在开始进入非线性的数据结构了。难度也比线性结构更大,本篇文章对广义表这种数据结构进行介绍并附上其实现的代码,广义表的实现主要应用递归,通过广义表可以更加理解和灵活使用递归,希望能给学习这块知识的朋友们带来帮助。 一、广义表概念 广义表是线性表的推广,是一种非线性的数据结构,也有人称其为列表。 举几个例子: (1)A=()  //A是一

XHfight的博客 2498

数据结构与算法丨广义表

数据结构与算法之列表。

AIGC 6192

数据结构之广义表

1.定义    广义表是对线性表的扩展,在线性表中,表中元素具有原子性,不可分解。如果允许表中的元素具有某种结构,这就引入了广义表的概念。广义表的定义如下:        语法图如下:    举个例子:    2.数据结构    结构:    为什么需要头节点?便于在表头增加删除结点。如果不要头结点,那么对广义表的表头添加删除,3.广义表的设计实现...

wobushixiaobailian的博客 9840

告别复杂模型:用UFLD算法5分钟搞定车道线检测(附Python代码)

本文介绍了UFLD(Ultra Fast Lane Detection)算法在车道线检测中的高效应用,仅需5行核心代码即可实现实时检测,特别适合边缘计算设备。通过对比传统方法,UFLD在推理速度、模型大小和硬件需求上具有显著优势,是深度学习领域轻量级解决方案的典范。

weixin_27872611的博客 289

数据结构 —— 广义表

什么是广义表 广义表是一种非线性的数据结构,它的表元素可以是原子或者广义表的一种线性表的扩展结构。 广义表的长度:为表中最上层元素的个数 广义表的深度:为表中括号的最大层数 表头和表尾:当广义表非空时,第一个元素为广义表的表头,其余元素组成的表是广义表的表尾 广义表的常用表示 ① E=() E是一个空表,其长度为0,其深度为1 ② L=(a,b) L是长度为2的广义表,它的两个元素都是原子,...

starter_____的博客 1万+

【LTspice】002 第一个仿真电路

目录 1. 光偶元件的工作原理 2. 过零检测电路的工作原理 3. 以PC817光耦搭建一个过零检测电路 1. 光偶元件的工作原理 光耦合器(optical coupler,英文缩写为OC)亦称光电隔离器或光电耦合器,简称光耦。它是以光为媒介来传输电信号的器件。 PC817是一种把红外光发射器件和红外光接受器件以及信号处理电路等封装在同一管座内的器件。当输入电信号加到输入端发光器件LED上,LED发光,光接受器件接受光信号并转换成电信号,然后将电信号直接输出,或者将电信号放大处理成标准数字电平输

m0_59642765的博客 8024

IP-Guard安全网关实例

企业相关情况: 1.OA系统,主要为日常工作使用,该系统IP为192.168.1.2,端口为8080; 2.文件共享服务器,用于存放日常工作资料和文档,该文件共享服务器的IP为192.168.1.1,其中\\192.168.1.1\private 目录中的存放着公司重要文档,不能随意外传; 3.安全网关已采用串联的方式联入网络,IP为192.168.2.6,所有机器访问OA系统和文件共享服务...

IP-Guard专栏 707

数据结构之数组与广义表

目录联系数组广义表 联系 数组和广义表可看作一种扩展的线性数据结构,其特殊性在于数据元素的构成上。从组成线性表的元素角度看,数组是由具有某种结构的数据元素构成,广义表则是由单个元素或子表构成的。数组和广义表是线性表的推广。 数组 1.数组的定义 从逻辑结构上,数组可以看成是对一般线性表的扩充。一维数组即为线性表,而二维数组可以定义为其数据元素为一维数组(线性表)的线性表。以此类推,N维数组是数据元...

L*YUE的博客 5843

【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏(附项目源码)

当今游戏产业中,经典游戏的复刻一直是一项受欢迎且具有挑战性的任务。俄罗斯方块是一个深入人心、令人上瘾的经典游戏,在过去几十年里一直享有广泛的流行度。其简单而富有策略性的玩法吸引了无数玩家的关注。因此,我决定利用Unity引擎来复刻这款经典游戏,以让更多的人重新体验其中的乐趣。通过使用Unity引擎,我能够利用其强大的工具和功能,从头开始构建一个与原版俄罗斯方块游戏相似的游戏。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2799

数据结构 (17)广义表

数据结构——广义表篇

m0_73399576的博客 1319

YOLO26 FP16/INT8混合量化实战:精度无损+速度拉满,边缘设备部署最优解

这是混合量化的灵魂,告诉量化器:哪些层不准动,保留FP16。"""判断是否为量化敏感层 → 是则豁免为FP16返回 True=敏感层(FP16),False=可量化(INT8)"""# 1. 检测头回归分支# 2. 小通道1×1卷积# 3. SiLU 激活# 4. 残差ShortcutYOLO26想要在Jetson、RK3588、昇腾、嵌入式NPU上真正落地,FP16/INT8混合量化是唯一最优解。它的核心逻辑不是玄学,而是工程上的精准取舍能量化的层,全部INT8榨性能;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 747

手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型

基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。

MHD0815的博客 545

【数据结构】多维数组和广义表

多维数组是线性表在维度上的扩展。从数学角度看,一个nnn维数组可以被定义为一个由多个下标确定元素位置的元素集合。例如,二维数组Am×nAm×n​是一个包含m×nm\times nm×n个元素的有序集合,其中每个元素aija_{ij}aij​1≤i≤m1≤i≤m1≤j≤n1≤j≤n)通过两个下标iii和jjj来唯一标识其在数组中的位置。三维数组Al×m×nAl×m×n​则是一个具有l×。

Guiat的博客 1332

【YOLO26科研级突破】集成BiFPN双向特征金字塔,让多尺度特征融合效率与精度双跃升

打开确保模型解析器能识别BiFPN模块。通过将BiFPN双向特征金字塔集成到YOLO26中,我们实现了一个“全尺度双向特征流动+加权融合+精准检测”的目标检测模型。这个改进不仅在工程上能大幅提升多尺度、复杂场景下的检测精度,更在科研上提供了“双向特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的Neck模块改进中,帮你在论文中打造独特的研究点。

LXY_LOVE36的博客 200

数据结构 广义表

前言 顾名思义,广义表就是线性表的拓展。通俗地理解,就是对于之前定义的线性表只能操作本表内的逻辑,而广义表拓宽了这个定义,于是能指向其他广义表,也就是说表与表之间建立起了联系。 概念 简单地概况广义表:表元素可以是原子也可以是一个广义表地线性表的拓展结构。 长度:最上层元素的个数,一个表可以指向其他广义表,此时其他广义表在本表中也抽象成一个元素;指向数据项也就是原子项,此时也为一个元素。 深度:其指向其他广义表的最大深度,因为其他广义表还可能再指向另外的广义表,此时求这个拓展的最大深度。注意,这里是最大深

小胡同的诗 1416

鲁棒控制理论 --- H∞ 控制(被裁篇)

鲁棒控制理论 --- H∞ 控制

记录老板的每次pua,分享领导每天的毒鸡汤... 6万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 【数据结构】静态链表与动态链表
下一篇: 【数据结构】三元组
HelloZEX
博客等级 码龄11年 486粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值