广义表相关总结
一.定义
广义表是线性表的推广,广义表中每个元素可以是原子,也可以是子表,原子即单个元素,而子表是广义表。我们可以发现,其实python中的数组就是一个广义表,其内元素可以是单个的元素,也可以是一个数组。
二.广义表的长度和深度
1.长度
广义表的长度就是看第一层所含的元素个数
2.深度
广义表的深度是max(每个元素深度) + 1
- A=():A是一个空表,长度为0,深度为1
- B=(e):B只有一个原子e,B的长度为1,深度为1
- C=(a,(b,c,d)):C的长度为2,深度为2
- D=(A,B,C)=((),(e),(a,(b,c,d))):D的长度为3,深度为3
- E=(a,E):E是一个递归的表,长度为2,深度无限。
三.广义表的存储结构
1.头尾链表存储表示
a):首先,我们要知道一个概念,当广义表LS非空时,我们把第一个元素a1称为LS的表头,其余元素加上最外层的括号组成的表(a2,a3,a4,...,an)作为LS的表尾。我们可以发现,表头可能是原子也可能是表,但是表尾一定是表。
b):我们可以发现广义表中有两种不同的元素,所以我们可以定义两个不同的结点,表结点和原子结点来存储。
tag=1 | hp | tp |
---|
表结点,其中hp指向表头,tp指向表尾。
tag=0 | data |
---|
原子结点
c):例子
L=(a,(x,y),((x)))
2.子表存储表示
a):这种表示方法应该说更好理解一些,就是把表中每个元素分开来看,而不是从表头表尾去分析。
tag=1 | hp | tp |
---|
表结点,其中hp指向子表,tp指向下一个元素结点。
tag=0 | data | tp |
---|
表结点,其中data是原子项的值,tp指向下一个元素结点。
b):例子
L=(a,(x,y),((x)))
四.递归求广义表深度
int GListDepth(GList L){
if(!L) return 1;//空表则返回1
if(L->tag == 0) return 0;//原子项返回0
for(max = 0, pp = L; pp; pp = pp->ptr.tp){//在元素间循环遍历
dep = GListDepth(pp->ptr.hp);//获取每个子表深度
if(dep > max) max = dep;//和最大的比较
}
return max + 1;//由于深度是每个元素深度+1.所以返回max+1
}