广义表相关总结

广义表相关总结

一.定义

广义表是线性表的推广,广义表中每个元素可以是原子,也可以是子表,原子即单个元素,而子表是广义表。我们可以发现,其实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
}
posted @ 2018-06-04 20:02  WhiteBlackCat  阅读(2979)  评论(1编辑  收藏  举报