Удаление элементов из дерева
Добавлено: 04 май 2009, 13:20
Пишу программу по удалению элементов в дереве. При непосредственно удалении выходит: Invalid pointer operation, на строчке dispose(p). Причем ошибка проявлятся не всегда. Не могу разобраться где косяк с опертором. (пробовала и функцию и процедуру удаления)
Задача: Напишите процедуру, которая удаляет из дерева все четные элементы.
[syntax=Pascal]
Program L1_3;
Type
bt=integer;
u=^zveno;
zveno=record
i:bt;
L,R:u
end;
Var T:u; a,b:byte; x:bt;
{ function udal (T:u; x:bt):u;
Var p,v:u;
begin
if T=nil then writeln ('element ne naiden')
else
if x<T^.i then T^.L:=udal(T^.L,x)
else
if x>T^.i then T^.R:=udal(T^.R,x)
else
begin
p:=T;
if T^.L=nil then T:=T^.L
else
if T^.R=nil then T:=T^.R
else
begin
V:=T^.L;
while V^.R^.R<>nil do
V:=V^.R;
T^.i:=V^.R^.i;
p:=V^.R;
V^.R:=V^.R^.L;
end;
dispose(p);
end;
udal:=T;
end; }
Procedure Del (var t:u; x:bt);
var p:u;
procedure D1 (Var rp:u);
begin
if rp^.R<>nil then d1(rp^.R)
else
begin
p^.i:=rp^.i;
p:=rp;
{if rp^.l<>NIL then }rp:=rp^.l;
dispose(p);
end;
end;
Begin
if t=nil then writeln ('elenenta net')
else
if x<t^.i then del (t^.L, x)
else
if x>t^.i then del(t^.R,x)
else
begin
p:=t;
if p^.r=nil then
begin
t:=p^.l;
dispose(p);
end
else
if p^.L=nil then
begin
t:=p^.R;
dispose (p);
end
else d1(p^.L)
end;
end;
Procedure poisk (T:u);
var x:bt;
begin
if T<>nil then
begin
poisk (T^.L);
if T^.i mod 2=0 then
begin
x:=T^.i;
del(T,x)
end;
poisk(T^.R)
end;
end;
procedure V_Der (var T:u; x:bt);
begin
if T=nil then
begin
new(T);
T^.i:=x;
T^.L:=nil;
T^.R:=nil;
end
else
if x<T^.i then V_Der (T^.L,x)
else V_Der (T^.R,x)
end;
procedure print (T:u);
begin
if T<>nil then
begin
print(T^.L);
Write (T^.i:5);
print(T^.R);
end;
end;
BEGIN
randomize;
b:=1+random(20);
for a:=1 to b do
begin
x:=-20+random(40);
V_Der (T,x);
end;
Write ('primal tree ');
print(T); writeln;
{if T<>nil then
while if T^.i mod 2=0
then udal(T,T^.i);
{ else begin poisk:=poisk (T^.L); poisk:=poisk(T^.R) end
end;}
poisk(T);
Write ('new tree ');
print(T); writeln;
readln;
END
[/syntax]
Задача: Напишите процедуру, которая удаляет из дерева все четные элементы.
[syntax=Pascal]
Program L1_3;
Type
bt=integer;
u=^zveno;
zveno=record
i:bt;
L,R:u
end;
Var T:u; a,b:byte; x:bt;
{ function udal (T:u; x:bt):u;
Var p,v:u;
begin
if T=nil then writeln ('element ne naiden')
else
if x<T^.i then T^.L:=udal(T^.L,x)
else
if x>T^.i then T^.R:=udal(T^.R,x)
else
begin
p:=T;
if T^.L=nil then T:=T^.L
else
if T^.R=nil then T:=T^.R
else
begin
V:=T^.L;
while V^.R^.R<>nil do
V:=V^.R;
T^.i:=V^.R^.i;
p:=V^.R;
V^.R:=V^.R^.L;
end;
dispose(p);
end;
udal:=T;
end; }
Procedure Del (var t:u; x:bt);
var p:u;
procedure D1 (Var rp:u);
begin
if rp^.R<>nil then d1(rp^.R)
else
begin
p^.i:=rp^.i;
p:=rp;
{if rp^.l<>NIL then }rp:=rp^.l;
dispose(p);
end;
end;
Begin
if t=nil then writeln ('elenenta net')
else
if x<t^.i then del (t^.L, x)
else
if x>t^.i then del(t^.R,x)
else
begin
p:=t;
if p^.r=nil then
begin
t:=p^.l;
dispose(p);
end
else
if p^.L=nil then
begin
t:=p^.R;
dispose (p);
end
else d1(p^.L)
end;
end;
Procedure poisk (T:u);
var x:bt;
begin
if T<>nil then
begin
poisk (T^.L);
if T^.i mod 2=0 then
begin
x:=T^.i;
del(T,x)
end;
poisk(T^.R)
end;
end;
procedure V_Der (var T:u; x:bt);
begin
if T=nil then
begin
new(T);
T^.i:=x;
T^.L:=nil;
T^.R:=nil;
end
else
if x<T^.i then V_Der (T^.L,x)
else V_Der (T^.R,x)
end;
procedure print (T:u);
begin
if T<>nil then
begin
print(T^.L);
Write (T^.i:5);
print(T^.R);
end;
end;
BEGIN
randomize;
b:=1+random(20);
for a:=1 to b do
begin
x:=-20+random(40);
V_Der (T,x);
end;
Write ('primal tree ');
print(T); writeln;
{if T<>nil then
while if T^.i mod 2=0
then udal(T,T^.i);
{ else begin poisk:=poisk (T^.L); poisk:=poisk(T^.R) end
end;}
poisk(T);
Write ('new tree ');
print(T); writeln;
readln;
END
[/syntax]