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

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

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

 
 Ответить  Открыть новую тему 
> Освобождение динамической памяти
сообщение
Сообщение #1


Гость






М
Пользуемся тегами
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.


Проблема... Как освободить динамическую память?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Извиняюсь, следущий раз воспользуюсь тегами...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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);
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(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"

что то нужно дописать?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

DisposeTree(T^.rlink); { <--- !!! }
DisposeTree(T^.llink); { <--- !!! }
Dispose(T)
End;


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Спасибо большо.
Все получилось. give_rose.gif
 К началу страницы 
+ Ответить 

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

 





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