数据结构课件第7章.ppt
文本预览下载声明
begin crtlists(st, ls2); new(ls1); ls1^.tag:=1; ls1^.hp:=ls2; ls1^.tp:=ls; ls:=ls1 end; procedure Tgyb.prnt; var i, ix, iy: integer; s: char; begin lsi:=1; prt(ls); {将广义表ls转换成书写形式后存入数组lsa中} …… ix:=10; iy:=10; for i:= 1 to lsi-1 do begin s:=lsa[i]; {在绘图板的(ix, iy)位置中显示字符s;} ix:=ix+20 end end; 在这个类的实现中,head、tail及merg操作的处理过程都比较简单,crt操作所涉及的crtlists过程以及prnt操作所涉及的prt过程均已在前节中作过讨论,这里尚需说明的是: 在prt过程中,我们使用了write语句输出广义表书写形式中的每一个字符。但在演示程序中,为了将结果显示在绘图板上, 先将输出的字符集中输出在一个数组(lsa)中,然后再将该数组中的字符串显示在绘图板上。 程序如下: function member (e, ls: point): boolean; var b1, b2: boolean; begin if ls=nil then result:=false else begin b1:= equal(e, ls^.hp); b2:=member(e, ls^.tp); result:=b1 or b2; end end; 7.3.3 复制广义表 我们已经知道, 任何一个非空的广义表均可分解成表头和表尾,反之,一对确定的表头和表尾可唯一确定一个广义表。 由此可见,复制一个广义表只要分别复制其表头和表尾,然后合成即可。假设ls为原表,newls为复制表, 则复制广义表的递归过程可表示为 procedure copyls (ls: point, var newls: point); 其中,参数ls表示原表,newls表示复制表, 其类型均为结点指针类型point,该过程的功能:复制广义表ls的一个副本newls。 即生成一个ls的副本并由newls指向它。 处理过程:若ls为nil则newls也为nil, 否则,生成一个新的表结点,并按原表是单元素或列表两种情形分别处理。若原表是单元素,则复制元素值;若原表是列表,则分别复制其表头和表尾,并分别挂在新生结点的头尾指针域上。 上述复制表头并将新表头的指针挂在新生结点的头指针域上, 这一处理过程正好可通过递归调用copyls(ls^.hp, newls^.hp)来完成, 因为copyls的功能就是要按第一个参数所指向的广义表生成一个副本,并由第二个参数中的指针来指向它。同样,复制表尾并将新表尾的指针挂在新生结点的尾指针域上,这一处理过程正好可通过递归调用copyls(ls^.tp, newls^.tp)来完成。 程序如下: procedure copyls (ls: point, var newls: point); begin if ls=nil then newls:=nil else begin new(newls); newls^.tag:=ls^.tag; if ls^.tag=0 then newls^.data:=ls^.data else begin copyls(ls^.hp, newls^.hp); copyls(ls^.tp, newls^.tp) end end end; 7.3.4 求广义表的深度 广义表的深度可定义为广义表中括号的层数,是广义表的一种量度。当广义表为单元素时,其深度为0;当广义表为空表或其所有的成员均为单元素时,其深度为1;否则,广义表的深度与其成员的深度有关,它总是比成员中最大的深度还要大1。因此,我们可以采用如下的递归的形式来定义广义表ls的深度depth。 对于广义表ls=(a1, a2, …, ai, …,
显示全部