高中信息技术 竞赛班数据结构专项培训教程 06广义表教案-人教版高中全册信息技术教案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
§6 广义表
§6.1 广义表的定义
广义表(Lists)又称列表,是线性表的推广,广义表是n (n≥0) 个元素(子表)a1 , a2 ,…, a n组成的有限序列,一般记作:
LS =( a1 , a2 ,…, a n )LS是广义表的名字,n为其表的长度其中a i或者是原子(单个元素)或者是一个广义表,分别称为广义表LS的单元素和子表。习惯上,用大写字母表示广义表的名称,用小写字母表示单元素。
广义表的定义是一个递归定义,因为在描述广义表时又用到了广义表的概念。
例如:
E=( ) E是一个空表,其长度为0。
L=(a, b) L是长度为2的列表,它的两个元素都是原子,因此它是一个线性表。
A=(x, L)=(x, (a, b)) A是长度为2的列表,第一个元素是原子x,第二个元素是子表L
B=(A, y)=((x, (a , b)), y) B是长度为2的
列表,第一个元素是
子表A,第二个元素
是原子y
C=(A, B)=((x, (a, b)) , ((x, (a, b)), y)) C 的长度为2,两个元素都是子表。
D=(a, D)=(a, (a, (a, (...) ) ) ) D的长度
为2,第一个元素
是原子,第二元素
是D自身。展开后,
它是一个无限列
表。
一个表的深度是指表展开所含括号的层数,例如,表A的深度为2,表D的深度为∞。值得注意的是广义表 ( ) 和 (( )) 不同,前者是空表,长度n=0;后者长度n=1,它有一个元素是空表,可分解得到表头和表尾均是空表( )。
广义表的特点:
(1)列表可以是递归的,如表D是它本身元素的子
表。
(2)列表是多层次的结构,表中的元素可以是子表,子表的元素还可以是子表,……
(3)列表可以为其它列表所共享,如上例中,表A 和表B 是表C 的子表。 §6.2 广义表的存储结构
由于广义表中的元素可以有不同的结构,单元素或子表,因此难以用顺序存储结构表示,通常采用链式存储结构。
结点的结构可以这样设计:
其中,tag 是标志域,
若tag =0,则第二个域中为data ,存储单元素;若tag =1,则第二个域中为hp ,存储指向子表的指针。link 为指向同一层下一个结点的指针。
【例6.2.1】 L =((a,(b)),a,((a,(c)),c),d)
【例
第二行:要查找的元素,如:d
输出:广义表中有该元素,则输出:Yes
否则输出: No
[参考程序]
program gyb;
type pointer=^node;
node=record
link:pointer;
case tag:0..1 of 0:(data:char); 1:(hp:pointer); end;
var i:integer; Q:string;
c:char; t:boolean;
head:pointer;
procedure creat(var p:pointer); var x:char;
begin
x:=Q[i]; i:=i+1;
case x of
'(':begin
new(p); p^.tag:=1; creat(p^.hp);
creat(p^.link);
end;
'a'..'z':begin
new(p); p^.tag:=0;procedure find(p:pointer);
begin
if p<>nil then
if p^.tag=0
then begin
if p^.data=c
then begin
t:=true;
exit;
end
else find(p^.link); end
else begin
find(p^.hp);
find(p^.link);
end;
end;
Begin
readln(Q);
readln(c);
i:=1;
t:=false;
creat(head);
find(head);
p^.data:=x;
creat(p^.link); end;
',':creat(p);
')':p:=nil;
end;
end;