求助
pascal吧
全部回复
仅看楼主
level 2
这个二叉树的程序
在运的时候无论怎么改都是106号错误
const m=200;
type
node=record
data: char;
prt,lch,rch:integer;
end;
treetype=array[1..m] of node;
var tree:treetype;
n,i,j,p:integer;
procedure preorder(i:integer);
begin
if i<>0 then
begin
write(tree[i].data);
preorder(tree[i].lch);
preorder(tree[i].rch);
end;
end;
procedure inorder(i:integer);
begin
if i<>0 then
begin
inorder(tree[i].lch);
write(tree[i].data);
inorder(tree[i].rch);
end;
end;
begin
assign(input,'work1.in'); reset(input) ;
assign(output,'work1.out'); rewrite(output);
fillchar(tree,sizeof(tree),0);
read(n);
for i:= 1 to n do
begin
read(tree[i].data);
read(j); {就是这里}
if j<>0 then
begin
tree[i].lch:= j;
tree[j].prt:=i;
p:=j;
repeat
read(j);
if j<>0 then begin
tree[p].rch:=j;
tree[j].prt:=p;
p:=j;
end;
until j=0;
end;
writeln;
end;
preorder(1);
writeln;
inorder(1);
close(input);
close(output);
end.
2016年05月20日 09点05分 1
level 2
为了拿经验这是多么标准的十五字
2016年05月20日 10点05分 2
level 9
虽然我看不懂,不过我拷贝过去编译,居然顺利一把过,毫无问题。
2016年05月20日 11点05分 3
话说这个程序是你原创的么?程序用于什么功能?
2016年05月20日 11点05分
这是把有序树转化为二叉树 然后再输出中序遍历和前序遍历
2016年05月20日 11点05分
@应无雨 LZ说的是运行有问题,不是编译 输入样例 18 r2 3 4 0 a5 6 0 b7 0 c8 9 10 0 w0 x11 12 0 f0 s13 14 0 t0 u0 d15 0 e0 i16 17 18 0 j0 h0 m0 o0 h0
2016年05月20日 11点05分
level 11
原题:
1.按照先根次序和后根次序遍历普遍有序树(work1.pas)
输入一棵普通有序树,输出该树的先根次序和后根次序。
输入(work1.in):第一行顶点数n(1≤n≤200),以下含n行,其中第i行(1≤i≤n)的元素依次为结点i的数据值ai,以后各元素为结点i的儿子序列,以0结束。若ai后仅含一个0,则说明结点i为叶子结点。
输出(work1.out):共2行,第一行输出这棵有序树的先根遍历,第二行输出这棵有序树的后根遍历。
右图对应的输入信息为
18
r2 3 4 0
a5 6 0
b7 0
c8 9 10 0
w0
x11 12 0
f0
s13 14 0
t0
u0
d15 0
e0
i16 17 18 0
j0
h0
m0
o0
h0
2016年05月20日 11点05分 4
level 13
type
treetype=record
data:char;
parent,left,right:longint;
end;
var
tree:array [0..200] of treetype;
i,n:longint;
procedure change;
var i,j:longint; s:char;
begin
for i:=1 to n do
begin
read(s); read(j);
tree[i].data:=s;
if j<>0
then begin
tree[i].left:=j; tree[j].parent:=i;
repeat
read(j);
if j<>0
then begin
tree[j-1].right:=j;
tree[j].parent:=j-1;
end;
until j=0;
end;
readln;
end;
end;
procedure preorder(i:longint);
begin
if i<>0
then begin
write(tree[i].data);
preorder(tree[i].left);
preorder(tree[i].right);
end;
end;
procedure inorder(i:longint);
begin
if i<>0
then begin
inorder(tree[i].left);
write(tree[i].data);
inorder(tree[i].right);
end;
end;
begin
assign(input,'work1.in'); reset(input);
assign(output,'work.out'); rewrite(output);
readln(n);
change;
preorder(1); writeln;
inorder(1);
close(input); close(output);
end.
2016年05月20日 11点05分 5
level 1
很强…话说fpc确实偶有莫名其妙的错误……
2016年05月20日 11点05分 6
level 4
问题已解决!
问题已解决!
问题已解决!
重要的事情说三遍
我知道你们想说什么。有图有真相。最后一行
2016年05月20日 16点05分 7
楼下说问题的关键
2016年05月20日 16点05分
正解[呵呵]
2016年05月24日 11点05分
level 4
这段程序有两个问题。
如果从const算第1行的话,
===
1)第34行的read应改为readln
===
2)第53行writeln应改为readln
===
34行的问题是关键。这导致了106错误。并不是编译器版本问题。read是直接找从光标开始符合类型的数据,而readln是先把光标调到下一行,然后从光标开始找符合类型的数据。如果用read,在34行读完n之后,下一个要读的数据是字符(37行),楼主的read导致n后面那个回车符被读进来了。这并不影响n的值,但是会影响后面的读入,因为这导致了数据错位。(说到这里懂的人就懒得往下看了,因为重点已经说完)
===
37行把回车符读进来也没问题,因为char确实可以储存回车符。之后那个38行也没问题,因为你输入的是数字,可以看成字符。直到这一行结束,就有问题了。也就是楼主说的38行{就是这里}那个地方。前面的数据错位导致了这里数据类型错误。于是106
===
其实,5楼的答案已经是正解。楼主细心一点的话就能发现,5楼读n的时候就是用readln。这一个差别很大。
===
53行是楼主多此一举了,只是重起一行,readln即可,用writeln的话会导致,每输入一行,就多打一行空,而且用writeln同样会导致数据错位。
===
也就是说,只有两个地方都改掉,才能避免106
===
除此之外,楼主递归代码没有任何问题。经检验算法正确。
[滑稽][滑稽][滑稽]楼主你是不是抄书的时候没抄仔细,或者不认识readln这几个字母呢[滑稽][滑稽][滑稽]
2016年05月20日 16点05分 8
大神[真棒]
2016年05月21日 04点05分
@YZZZZ-Z “5楼的答案是正解”这句我喜欢
2016年05月21日 07点05分
太强了[滑稽]
2016年05月24日 11点05分
大神
2016年05月24日 11点05分
1