Форум программистов, компьютерный форум, киберфорум
Наши страницы

Free Pascal

Войти
Регистрация
Восстановить пароль
 
GrukhvinEV
25 / 25 / 0
Регистрация: 08.11.2011
Сообщений: 284
#1

Высвобождение памяти занимаемой деревом. - Free Pascal

19.01.2012, 17:34. Просмотров 507. Ответов 4
Метки нет (Все метки)

Есть код построения и поиска максимального значения элемента дерева, как удалить дерево для высвобождения памяти ?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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:=round(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;
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);readln;
end.
Добавлено через 2 часа 12 минут
Вот написал, но что то не работает =))
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 procedure DelTree(var T:TTree);
 var A:TTree;
 begin
       if (T^.left=nil) and (T^.right=nil)
       then  begin
                       dispose(T);
                       T:=A;
                       DelTree(T);
               end
       else begin A:=T;
                     if T^.left<>nil then DelTree(T^.left);
                     if T^.right<>nil then DelTree(T^.right);
             end;
 end;
Добавлено через 13 минут
А, понял, фигню написал, такой алгоритм работает только если дерево из 3 элементов =))

Добавлено через 9 минут
Так тоже не работает =)) Мб у кого есть варианты ? =))
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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.
Добавлено через 18 часов 52 минуты
Видимо вот как надо =))
Pascal
1
2
3
4
5
6
7
8
9
10
procedure DelTree(var T:TTree);
begin
   if T <> nil then
   begin
      DelTree(T^.right);
      DelTree(T^.left);
 
      Dispose(T);
   end;
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2012, 17:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Высвобождение памяти занимаемой деревом. (Free Pascal):

Высвобождение памяти компонента - Delphi
Добрый вечер, снова я. Не подскажите как организовать следующее: допустим я создаю динамический компонент при создании формы, скажем так: ...

Долгое высвобождение памяти - C++
Здравствуйте. Возможно, такой вопрос уже встречался, но ответа мне найти не удалось. Намахал template List. ~List(){ Item *srh =...

Высвобождение кешированной оперативной памяти - C#
Всем привет. Можно ли как то высвободить кешированную оперативную память системы средствами С# ?

Корректное высвобождение памяти в list - C++
У меня все нормально работает, ну и по логике тоже вроде нормально, но намучился с Коректным высвобождением памяти(ну пару раз упала...

Высвобождение памяти для 3 измерения массива - C++
Здравствуйте. Не могу понять почему выходит ошибка. Я сделал 3х мерный массив, у которого 2 строки . Он неравномерный. В 1 строке 3...

Определение объема памяти занимаемой переменной - C#
как определить сколько памяти занимает переменная?

4
PolarFoG
NPC
151 / 145 / 10
Регистрация: 10.01.2012
Сообщений: 390
19.01.2012, 21:33 #2
Спасибо за задачку : ) Вчера не дописал, а на работе не до ого было
Решения отчистки памяти похожи

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
program project;
{$mode Objfpc} {$H+}
 
uses
Crt, SysUtils;
type
  List=^TRec;
  TRec=record
    data:integer;
    left,right:List;
    end;
var
  pN,pH,t1,t2:List;
  n,nH,e:integer;
 
procedure Del_p(p:list);
begin
if p=nil then begin
dispose(p); exit;
end;
Del_p(p^.left);
Del_p(p^.right);
Dispose(p);
end;
 
function new_p(var n:integer):List;
var
  p:List;
begin
  if n=0 then begin
  result:=nil;
  exit;
  end;
new(p);
dec(n);
result:=p;
p^.left:=new_p(n);
p^.right:=new_p(n);
p^.data:=random(1000);
end;
 
begin
readln(n);
nH:=n;
pH:=new_p(n);
Del_p(pH);
 
write('>>>');
readkey;
end.
0
GrukhvinEV
25 / 25 / 0
Регистрация: 08.11.2011
Сообщений: 284
20.01.2012, 19:51  [ТС] #3
Пожалуйста, пока никто не отвечал, я тут чуть велосипед не изобрел =))
0
sandye51
программист С++
685 / 587 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
20.01.2012, 23:37 #4
Цитата Сообщение от PolarFoG Посмотреть сообщение
if p=nil then begin
dispose(p); exit;
зачем удалять nil? Оо
0
PolarFoG
NPC
151 / 145 / 10
Регистрация: 10.01.2012
Сообщений: 390
21.01.2012, 00:23 #5
Не спорю, лишний оператор...забыл удалит
0
21.01.2012, 00:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2012, 00:23
Привет! Вот еще темы с ответами:

Постоянно возрастает количество занимаемой памяти - C#
Вечер добрый. Вот код программы using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

.NET 4.x Уменьшение объёма памяти, занимаемой приложением - C#
вот у меня написано &quot;обнуление&quot; for(i%200==0) { Application.DoEvents(); } почему у меня в процессах размер окна открытого все...

Подсчет занимаемой памяти приведенным кодом - Pascal ABC
Сколько памяти занимает данный отрывок до var и вместе с var, может быть вопрос задан не корректно... но нужно сказать сколько памяти...

.NET 4.x Топ процессов по занимаемой памяти и загрузки ЦП - C#
Здравствуйте. Подскажите пожалуйста как вывести 5 процессов в порядке убывания. 5 шт. по занимаемой памяти и 5 шт. по загрузке ЦП. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru