请在下列各题的 (N) 处,填写适当的Pascal语句(或其它成份),完成各题的程序。
题八(10分)下列程序输入一个正整数N(0<n<10),打印1,2,….,n各数字的全排列,例如输入n=3,打印123,132,213,231,312,321
program exam8(input,output);
const maxn=9;
var a:array[1..maxn] of integer;{放全排序一个值}
s:set of 1..maxn;{放1到9各数字的集合}
n:integer
procedure load(j:integer);{将S中数字装入到a中}
var j,k integer;
begin
for j:=1 to n do
if j in s
then begin
s:= (1)
a[i]:=j;
if i<n
then (2)
else for k:=1 to n do writen(a[k]);
(3)
end
end{load};
begin {main}
readln(n); s:=[1..n]; load(1)
end.
题九(10分)下面的过程对二叉树进行后序遍历(非递归)。假设已有栈的一些操作过程说明。并说明树的结点类型:
type pointer= node;
node=record
data:integer ;
left,right :pointer
end;
procedure post(p:pointer);
var q:pointer;
begin
if p<> then
begin create_stack(s);{建立一个S栈,并初始化为空栈}
while (P<>nil) or not empty_stack(s){s栈不空} do
if p<>nil
then begin
push(s,p); {将P进栈}
push(s,p);{P作为标记进栈}
P:= (1)
end
else begin
pop(s,p);{将标记退出S栈}{退出到P中}
if p<>nil
then begin
push(s,nil){标记进栈}
(2) ;
end
else begin
(3) ;
write(q .data);{访问结点,打印结点数据}
end
end
end{post}
题十(8分)设结点的类型定义如下:
type
node=record data:integer; link:integer end;
在数组a中存放了10个 结点:
var a:array[1..10] of node;
假定在主程序中已经执行了下列语句:
for i:=1 to 10 do
begin a[i].data:=i, a[i].link:=0 end;
最初将10个结点看成分别属于10个集合,每个集合有且仅有一个结点,调用下面过程,判断data=m和data=n的两个结点是否在同一个集合中(最初肯定属于不同集合,除非m=n),若不在同一集合中,则将这两个结点合并到一个集合中。否则,已在同一个集合中,什么也不做。(此方法用于Kruskal求最小生成树的算法中)
procedure merge_set(m,n:integer);
function find(k:integer):integer;
var f:integer;
begin
f:=k;
while a[k].link<>0 do f:=a[k].link;
(1) ;
end;
begin
m:=find(m); n:=frind(n);
if m<>n then (2)
end{merge_set}
题十一(14分)设有数组变量说明:
var a:array[1..n] of record key:integer; next:0..n end;
假设各元素的key已有值,并且假设最大值<=9999,再假定在主程序已执行下面语句,已将各元素组成一个链;
for i:=Ø to n-1 do a[i].next:=i+1;
a[i]:= Ø
下面是以10为基的基数排序法过程,将数组a按Key由小到大排序。
Procedure bucket_sorting;
Const maxkey=9999;
Var bucket,tail :array[0..9] of 0..n;
P,last:0..n;
i:=0..9;
d:integer;
begin
d:=1;
repeat
for i:=0 to 9 do tail[i]:= Ø;
{分解}
P:=a[0].next;{a[0].next是链的第一个结点}
While P<> Ø do
Begin i:=a[p].key div d mod 10;
If (1)
Then bucket[i]:=p
Else a[ (2) ].next:=p;
Tail[i]:=p;
(3)
end
{收集}
last:=0
for i:=0 to 9 do
if (4)
then begin
a[last].next:= (5) ;
last:= (6)
end;
a[last].next:= Ø;
d:= (7)
until d>maxkey
end{bucket_sorting}
题十二(12分)下面是一个判断二叉树是否是排序平衡树的函数说明,若是排序平衡树,则返回值为真,否则返回值假,另外,以参数的形式返回二叉树的高度和最大最小结点值。结点的类型定义与题九的定义相同。
Function isbalance(p:pointer;var h,min,max:integer)
Var hleft,hright,lmax,rmin:integer;
Begin
If p<>nil
then begin
if osbalance(p .left,hleft, (1) )
and isbalance(P .right,hright, (2) )
then begin
if hleft=0
then begin min:=p .data; lmax:=p .data-1 end;
if hright=0
then begin max:=p .data; rmin=p . data+1 end;
if hleft>hright
then h:=hleft+1 else h:=hright+1;
isbalanced:=(abs(hleft-hright)<=1)
and ( (3) )
and ( (3) )
end
else isbalanced:=false
end
else begin h:=0; isbalanced:=true end
end{isbalance}
题七(12分)已知a数组元素共5个,依次为12,10,5,3,1;b数组元素共4个,依次为4,6,8,15,则执行如下所示的过15,12,10,8,6,5,4,3,1,数组a,b,c的长度分别为l=5,m=4,n=9,请在程序中方框内填入正确的成份,以完成上述要求。
Procedure Sort
Var i,j,k,x:integer:
d:array[1..m] of integer;
begin
for i:=1 to m do d[i]:=
i:=1;j:=1;k:=1;
while(i<=l) and (j<=m) do
begin
if a[i]>d[i]
then begin
end;
else begin
end;
c[k]:=x;
end;
while do
begin
c[k]:=a[i]; k:=k+1;i:=i+1
end;
while do
begin
c[k]:=d[j]; k:=k+1;j:=j+1
end;
end;{sort}
题八(8分)已知如下一棵三阶B_树,试画出插入关键字B,L,P,Q,R以后的树形。