IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Бинарные деревья(функция Dispose), Проблема с удалением листьев дерева
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Здравствуйте. Помогите, пожалуйста, решить проблему: при удалении листьев дерева и его повторном обходе Turbo Pascal вылетает(закрывается). Пожскажите в чем ошибся, описание алгоритмов формирования, вывода и остальное, кроме процедуры удаления листьев брал с FAQа сайта. Вот описание процедур(создания, печати и удаления "листвы"):


uses crt;
type
ttype=integer;
ttree=^tnode;
tnode=record
left: ttree;
right:ttree;
key:integer;
level: integer;
end;

procedure add(var t:ttree;x:ttype);
procedure createnode(var p:ttree;n:ttype);
begin
new(p);
p^.key:=n;
p^.left:=nil;
p^.right:=nil;
end;
begin
if t=nil then createnode(t,x)
else with t^ do begin
if key<x then add(right,x)
else if key>x then add(left,x);end;
end;

procedure PrintDown(T: TTree);
begin
if T=nil then exit;
with T^ do begin
write(key,' ');
writeln;
PrintDown(left);
PrintDown(right);
end
end;

{процедура удаления листьев}
procedure del1(var v:ttree);
var t:ttree;
inf: integer;
begin
if v=nil then exit;
del1(v^.left);
del1(v^.right);
if (v^.left=nil) and (v^.right=nil) then dispose(v);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Пожскажите в чем ошибся
В процедуре удаления листа... Во-первых, после Dispose значение указателя не является нулевым, а является неопределенным, то есть, куда такой указатель тебя зашлет при вызове PrintDown - одному процессору известно... А во-вторых, запускать рекурсию нужно только тогда, когда не выполняется условие (left = nil) and (right = nil), а не ВСЕГДА... Вот так должно работать:
procedure del1(var v:ttree);
var t: ttree;
begin
if v = nil then exit;

if (v^.left=nil) and (v^.right=nil) then begin
dispose(v); v := nil;
end
else begin
del1(v^.left);
del1(v^.right);
end;
end;

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.09.2020 22:50
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name