广义表总结 深度长度 实现程序 存储结构 表头表尾

广义表相关总结
一.定义
广义表是线性表的推广,广义表中每个元素可以是原子,也可以是子表,原子即单个元素,而子表是广义表。我们可以发现,其实python中的数组就是一个广义表,其内元素可以是单个的元素,也可以是一个数组。
二.广义表的长度和深度
1.长度
广义表的长度(广度)指:广义表中所包含的数据元素的个数
例如,在广义表 {a,{b,c,d}} 中,它包含一个原子和一个子表,因此该广义表的长度为 2。
再比如,广义表 {{a,b,c}} 中只有一个子表 {a,b,c},因此它的长度为 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,2},{3,{4,5}}} ,子表 {1,2} 和 {3,{4,5}} 位于同层,广义表中包含 3 层括号,深度为 3。
广义表的深度,指的是广义表中括号的重数。
例如:C=(a,(b,c,d)):
广义表的深度
图1中,从前往后数左括号的数量就是广义表C的深度,为2;也可以从右往左数右括号的数量(红色)

三.递归求广义表深度
求广义表深度的算法用到的是递归的思想,解题思路是:
(1)从广义表 C 的开头位置,一次遍历表中每个数据元素:当遍历对象为原子时,返回原子的深度为 0 ;遍历对象为表 C 的子表时,继续遍历子表中的数据元素。
(2)递归的出口有两个:当遍历对象为原子时,返回 0 ;遍历对象为空表时,返回 1 (空表的深度为 1 );
(3)设置一个初始值为 0 的整形变量 max ,用 max 和遍历过程中返回的整形数值进行比较,取大的那一个,知道程序结束,max + 1就是广义表的深度。
2

3

四 广义表表头和表尾
当广义表LS非空时,称第一个元素为LS的表头;称广义表LS中除去表头后其余元素组成的广义表为LS的表尾。例如,广义表(a, (b))的表头是单元素a,表尾是广义表((b))。
  根据广义表对表头和表尾的定义可知:对任意一个非空的广义表,其表头可能是单元素,也可能是广义表,而其表尾一定是广义表。注意表尾的深度(即括号的嵌套层数),表尾是由除了表头以外的其余元素组成的广义表,所以,需要在表尾的直接元素外面再加一层括号。
  求广义表的表头和表尾是广义表的基本操作,给定一个广义表,可以将某个单元素通过表头和表尾求出。例如,已知广义表L=(a,(b,(c,(d)), e), f ),通过表头和表尾操作将单元素c求出,则在求c的每一步均要将包含c的子表或单元素取出,求解过程为:
  ⑴ L1=Tail(L)=((b,(c,(d)), e), f )
  ⑵ L2=Head(L1)= (b,(c,(d)), e)
  ⑶ L3=Tail(L2)=((c,(d)), e)
  ⑷ L4=Head(L3)=(c,(d))
  ⑸ L5=Head(L4)= c
  所以,将单元素c从广义表L中取出的操作为:Head(Head(Tail(Head(Tail(L)))))。
题目:
广义表((a,b),c,d)表头和表尾分别是什么?
表头(a,b)
表尾(c,d)
(去掉表头剩下的是表尾)
五.广义表的存储结构
1.头尾链表存储表示
当广义表LS非空时,我们把第一个元素a1称为LS的表头,其余元素加上最外层的括号组成的表(a2,a3,a4,…,an)作为LS的表尾。我们可以发现,表头可能是原子也可能是表,但是表尾一定是表。
由于广义表中的数据元素既可能是列表也可能是单元素,相应地在头尾表示法中结点的结构形式有两种:一种是表结点,用以表示列表;另一种是元素结点(原子结点),用以表示单元素:
1表结点中包括一个指向表头的指针和指向表尾的指针;
2元素结点中应该包括所表示单元素的元素值。
3为了区分这两类结点,在结点中还要设置一个标志域:如果标志为1,则表示该结点为表结点;如果标志为0,则表示该结点为元素结点。
4
表结点,其中hp指向表头,tp指向表尾。
5
原子结点
c):例子

6

2.子表存储表示
a):这种表示方法应该说更好理解一些,就是把表中每个元素分开来看,而不是从表头表尾去分析。
7

表结点,其中hp指向子表,tp指向下一个元素结点。
8

原子结点,其中data是原子项的值,tp指向下一个元素结点。
b):例子
9

例题::
题目1:广义表 (a,(a,b),d,e,((i,j),k)) 的长度是( ),深度是( )
其长度为5、深度为3、为什么呢?
长度的求法为最大括号中的逗号数加1,
即为:
a后面的逗号,
(a,b)后面的逗号,
d后面的逗号,
e后面的逗号,((i,j),k)前面的逗号,
总计有四个,那么广义表的长度是4+1=5;
深度的求法为上面每个元素的括号匹配数加1的最大值,
a为0+1=1;
(a,b)为1+1=2;
d,e类似a;
((i,j),k)为2+1=3;
故深度为3。

题目2:求广义表E((a,(a,b),((a,b),c)))的长度和深度。
本题也可以这样解E((a,(a,b),((a,b),c)))
E((a,(a,b),((a,b),c)))
E(x)
x=((a,(a,b),((a,b),c))) 最外层0个逗号 长度是0+1 所以长度是 1
深度求解:

所以深度为 4

/实现代码:/
typedef struct GLNode{
int tag;//标志域
union{
char atom;//原子结点的值域
struct{
struct GLNode * hp,*tp;
}ptr;//子表结点的指针域,hp指向表头;tp指向表尾
};
}*Glist,GNode;

int GlistDepth(Glist C){
//如果表C为空表时,直接返回长度1;
if (!C) {
return 1;
}
//如果表C为原子时,直接返回0;
if (C->tag==0) {
return 0;
}
int max=0;//设置表C的初始长度为0;
for (Glist pp=C; pp; pp=pp->ptr.tp) {//在元素间循环遍历
int dep=GlistDepth(pp->ptr.hp);//获取每个子表深度
if (dep>max) {
max=dep;//每次找到表中遍历到深度最大的表,并用max记录
}
}
//程序运行至此处,表明广义表不是空表,由于原子返回的是0,而实际长度是1,所以,此处要+1;
return max+1;
}

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打工人_cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值