高中信息技术 竞赛班数据结构专项培训教程 06广义表教案-人教版高中全册信息技术教案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档