Помощь - Поиск - Пользователи - Календарь
Полная версия: Освобождение динамической памяти
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Она
М
Пользуемся тегами
klem4


условие задачи: Разработать программу, которая определяет, равны ли два бинарных дерева.

Реализована таким образом:

uses Crt; 
Type 
pptr = ^TTree; 
TTree = 
Record 
info: Char; 
llink, rlink: pptr; 
End; 

Function AddToTree(root: pptr; 
nValue: Char): pptr; 
Begin 
If root = nil Then 
Begin 
root := New(pptr); 
root^.info := nValue; 
root^.llink := nil; 
root^.rlink := nil; 
AddToTree := root; 
Exit; 

End; 

If root^.info < nValue Then 
root^.rlink := AddToTree(root^.rlink, nValue) 
Else 
root^.llink := AddToTree(root^.llink, nValue); 
AddToTree := root; 
End; 

function equal(p1, p2 : pptr) : boolean; 
begin 
if (p1=nil) and (p2=nil) then equal := true 
else if (p1<>nil) and (p2<>nil) 
then equal := (p1^.info= p2^.info) and equal(p1^.llink, p2^.llink) 
and equal(p1^.rlink, p2^.rlink) 
else equal := false; 
end; 

Var 
s, s1: String; 
root, root1: pptr; 
i: byte; 
Begin 
ClrScr; 
begin 
writeln(memavail); 
writeln('vvedite simvoly pervogo dereva:'); 
readln(s); 
root := nil; 
For i := 1 To Length(s) Do 
root := AddToTree(root, s[i]); 
end; 
begin 
writeln('vvedite simvoly vtorogo dereva:'); 
read(s1); 
root1 := nil; 
For i := 1 To Length(s1) Do 
root1 := AddToTree(root1, s1[i]); 
end; 

if equal(root, root1)=true then writeln('dwa dereva ravny') 
else writeln('dwa dereva ne ravny'); 
writeln(memavail); 
Readkey 
End. 


Проблема... Как освободить динамическую память?
Гость
Извиняюсь, следущий раз воспользуюсь тегами...
volvo
Procedure DisposeTree(T: pptr);
Begin
  If T = nil Then Exit;

  Delete(T^.rlink);
  Delete(T^.llink);
  Dispose(T)
End;

...

  if equal(root, root1) then writeln('dwa dereva ravny') 
  else writeln('dwa dereva ne ravny'); 

  DisposeTree(root);
  DisposeTree(root1);

  writeln(memavail);
...
Гость
Цитата(volvo @ 5.04.2007 20:40) *

Procedure DisposeTree(T: pptr);
Begin
  If T = nil Then Exit;

  Delete(T^.rlink);
  Delete(T^.llink);
  Dispose(T)
End;

...

  if equal(root, root1) then writeln('dwa dereva ravny') 
  else writeln('dwa dereva ne ravny'); 

  DisposeTree(root);
  DisposeTree(root1);

  writeln(memavail);
...



на строчках

  Delete(T^.rlink);
  Delete(T^.llink);
 

выдает ошибку "string variable expected"

что то нужно дописать?
volvo
В одном месте исправил, в остальных - нет... Вот так должно быть:
Procedure DisposeTree(T: pptr);
Begin
  If T = nil Then Exit;

  DisposeTree(T^.rlink); { <--- !!! }
  DisposeTree(T^.llink); { <--- !!! }
  Dispose(T)
End;
Она
Спасибо большо.
Все получилось. give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.