Страница 1 из 1

Удаление элементов из дерева

Добавлено: 04 май 2009, 13:20
Manul4ik
Пишу программу по удалению элементов в дереве. При непосредственно удалении выходит: 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]

Re: Удаление элементов из дерева

Добавлено: 04 май 2009, 13:57
Игорь Акопян
не очень понятно как у вас заполняется дерево в процедуре V_Der
поля L и R всегда будут nil

Есть ощущение, что это кусок другой проги, который вы пытались адаптировать к вашей задаче

Re: Удаление элементов из дерева

Добавлено: 04 май 2009, 14:36
Manul4ik
Игорь Акопян писал(а):Есть ощущение, что это кусок другой проги, который вы пытались адаптировать к вашей задаче
Наверно, можно сказать и так. Когда-то давно в лекциях давали стандартные процедуры печати и добавления элемента в дерево. Если проблема в ней, откройте мне глаза, пожалуйста. Т.к. после нескольких недель уже полный ступор

Re: Удаление элементов из дерева

Добавлено: 05 май 2009, 11:11
Игорь Акопян
надо начать с самого начала :)
Какое дерево вам нужно, на что указывают L и R поля элемента? Потом надо аккуратно заполнить его. Если тут всё нормально, выводим его. И только потом реализуем поиск элемента и его удаление.