Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление элементов дерева 
:(
    Опции темы
Manul4ik
Дата 4.5.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 4.5.2009

Репутация: нет
Всего: нет



Пишу программу по удалению элементов в дереве. При непосредственно удалении выходит: Invalid pointer operation, на строчке dispose(p). Причем ошибка проявлятся не всегда. Не могу разобраться где косяк с опертором. (пробовала и функцию и процедуру удаления)

Задача: Напишите процедуру, которая удаляет из дерева все четные элементы.

Код

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


Это сообщение отредактировал(а) Manul4ik - 4.5.2009, 12:40
PM MAIL   Вверх
volvo877
Дата 4.5.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Я тебе уже дал ссылку: http://volvo71.narod.ru/faq_folder/bin_tre...bintree_delnode , там написано, как удалить элемент из дерева. Не все так просто...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.