1.什么叫广义表?
一个广义表是n个表元素的一个序列,若n=0时称为空表。设为广义表的第i个元素,则广义表GL的一般表示与线性表相同:。其中,n表示广义表的长度,即广义表中所含元素的个数,且n0。如果是单个数据元素,则是广义表GL的原子;如果是一个广义表,则是广义表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)添加和删除头元素
在广义表表首插入元素。
(5)计算深度和广度
广义表的长度就是广义表元素的个数,即广义表最高层结点个数;广义表的重数就是广义表内部括号的重数。
(6)广义表遍历