学习数据结构(六)——广义表

1.什么叫广义表?

一个广义表是n个表元素的一个序列,若n=0时称为空表。设a_{i}为广义表的第i个元素,则广义表GL的一般表示与线性表相同:GL=(a_{1},a_{2},\cdots ,a_{i},\cdots,a_{n})。其中,n表示广义表的长度,即广义表中所含元素的个数,且n\geq0。如果a_{i}是单个数据元素,则a_{i}是广义表GL的原子;如果a_{i}是一个广义表,则a_{i}是广义表GL的子表。广义表具有如下属性:(1)有序性:广义表中的数据元素有相对次序。(2)有长度:广义表的长度定义为最外层包含元素个数。(3)有深度(4)可共享:一个广义表可以为其他广义表共享。(5)可递归:一个广义表可以是自己的子表,这种广义表称为递归表。递归表的深度是无穷值,长度是有限值。(6)多层次:任何一个非空广义表GL均可分解为表头和表尾。

广义表是一种递归的数据结构,很难为其分配固定大小的存储空间,只能采用动态链式结构。存储结构分为头尾表示法和孩子兄弟表示法。

(1)头尾表示法

其存储方式形式为包括两种形式:(1)表结点,由指向表头的指针hp、指向表尾的指向tp以及结点标志(值为1)组成(2)元素结点:由结点标志(值为0)以及元素值data组成。

(2)孩子兄弟表示法

其也存在两种结点模式:(1)子表结点:包括标志域(值为1)、指向第一个孩子的指针域hp以及指向兄弟的指针域tp。(2)包括标志域(值为0)、数据data以及指向兄弟的指针。

2.广义表的操作

在该方法中,经常用分治法进行递归操作,即把广义表分成表头和表尾进行处理。

(1)广义表的复制

复制分两部分进行,一是复制头元素,二是复制子表。将广义表表头指针所指的所有结点复制到一张新的广义表中即可。

(2)广义表的销毁

广义表的销毁就是释放头指针所指所有结点,结点包括头元素和子表。

(3)取头元素和尾元素

广义表取头元素,就是将结点头指针所指的原子或子表的地址返回;而广义表的尾元素一定是个子表。

(4)添加和删除头元素

在广义表表首插入元素。

扫描二维码关注公众号,回复: 12792331 查看本文章

(5)计算深度和广度

广义表的长度就是广义表元素的个数,即广义表最高层结点个数;广义表的重数就是广义表内部括号的重数。

Depth(LP)=\left\{\begin{matrix} 1 LP==NULL\\ 0 LP==atom \\ MAX(p_{1},p_{2},\cdots,p_{n})+1 LP==list \end{matrix}\right.

(6)广义表遍历

 

猜你喜欢

转载自blog.csdn.net/qq_35789421/article/details/113774530