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

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

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

 
 Ответить  Открыть новую тему 
> Высвобождение памяти занимаемой деревом.
GrukhvinEV
сообщение 18.01.2012 22:27
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

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


Есть код построения и поиска максимального значения элемента дерева, как удалить дерево для высвобождения памяти ? Написал процедуру удаления, не работает, что не верно ?
Program Lab_6;
uses crt;
type
TTree=^Tnode;
Tnode=record
inf:integer;
left,right:TTree;
end;
procedure Search_Max(var T:TTree;var elem:integer);
begin
if T<>nil
then
begin
if T^.inf>elem
then
elem:=T^.inf;
Search_Max(T^.right,elem);
Search_Max(T^.left,elem);
end;
end;
procedure RandomFillTree(var node:TTree; var nodes:integer);
var
left,right:integer;
begin
if nodes=0
then
exit;
left:=random(nodes);
right:=nodes-left-1;
new(node);
node^.inf:=random(1000);
writeln(' nodes:', nodes,' left:', left,' right:', right,' inf:', node^.inf);
node^.left:=nil;
node^.right:=nil;
RandomFillTree(node^.left, left);
RandomFillTree(node^.right, right);
end;
procedure DelTree(var T:TTree; const M:TTree);
begin
if (T^.left=nil) and (T^.right=nil)
then begin
dispose(T);
T:=M;
if T<>nil then
DelTree(T,M);
end
else begin if T^.left<>nil then DelTree(T^.left,M);
if T^.right<>nil then DelTree(T^.right,M);
end;
end;
var
T:TTree;
Max,total_nodes:integer;
begin
clrscr;
writeln('Введите количество элементов дерева:');
readln(total_nodes);
RandomFillTree(T, total_nodes);
Search_Max(T, Max);
writeln;
writeln('Max= ', max);
writeln(T^.inf);
DelTree(T,T);
readln;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 18.01.2012 23:07
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


Цитата
Написал процедуру удаления, не работает
То есть, вот это уже слишком просто?
procedure DelTree(var T:TTree);
begin
if T <> nil then
begin
DelTree(T^.right);
DelTree(T^.left);

Dispose(T);
end;
end;


Надо сделать как можно сложнее, "чтоб никто не догадался" (С), как оно работает?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GrukhvinEV
сообщение 19.01.2012 16:30
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

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


Ой спасибо! Да я начинающий )))) Сидел вчера весь вечер велосипед изобретал ))))))) А еще вопрос а как проверить удалил ли я все динамические элементы или нет ? Не конкретно в этой программе а вообще.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.01.2012 16:53
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


Вообще - использовать нормальный компилятор:

FPC 2.6.0 с ключом -gh выдает:
Неправильно реализованное удаление (Показать/Скрыть)


Правильное удаление (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GrukhvinEV
сообщение 19.01.2012 18:10
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

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


Спасибо! Щас буду разбираться!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 19.07.2025 14:57
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"