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

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

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

 
 Ответить  Открыть новую тему 
> Освобождение динамической памяти
Она
сообщение 5.04.2007 20:19
Сообщение #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.


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


Гость






Извиняюсь, следущий раз воспользуюсь тегами...
 К началу страницы 
+ Ответить 
volvo
сообщение 5.04.2007 20:40
Сообщение #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);
...
 К началу страницы 
+ Ответить 
Гость
сообщение 7.04.2007 9:31
Сообщение #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"

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


Гость






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

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


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


Гость






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

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

 



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