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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 535
#1

Очистка памяти. Бинарное дерево. - C++

22.12.2011, 15:18. Просмотров 2973. Ответов 18
Метки нет (Все метки)

Как очистить память если не удалось выделить её,очистить то что удлось выделить

,и как удалить память если удалось выделить,

delete tree; не пойдет

Как это правильно реальзовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2011, 15:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Очистка памяти. Бинарное дерево. (C++):

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру - C++
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой - C++
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.

Бинарное дерево - C++
пытаюсь самостоятельно разобраться с этим, но чето не выходит вот мой листинг. вроде кудато чтото вводит, но ничего не выводит....

Бинарное дерево - C++
Объясните пжлст почему не работает программа...при вводе файла пишет -842150451 /*Дан адрес P1 вершины дерева — записи типа TNode, ...

Бинарное дерево - C++
Помогите исправить ошибку, компилятор ругается на 110 строку, не пойму почему( #include <iostream> #include <cstdlib> #include...

Бинарное дерево - C++
Не получается написать функцию для вывода дерева на экран. Работает она как-то не правильно. Помогите, пожалуйста, срочно. ВОт часть кода: ...

18
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
22.12.2011, 16:38 #2
C
1
2
3
4
while ( tree )
{  
    Del ( &tree ); //  Это ваша функция удаления элемента из дерева
}
Просто удаляем все элементы.
0
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 535
22.12.2011, 16:41  [ТС] #3
А если не хватило памяти при выделении?удалить то что выделили и выход как в коде реализовать?
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 16:45 #4
Я бы просто выделял бы память сразу на все. Посчитал бы сколько требуется памяти на указатели + данные, выделил бы сразу, а потом проставил бы указатели. Тогда и удалять стало бы легче...
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
22.12.2011, 16:47 #5
C
1
2
3
4
5
6
7
8
9
void NotMemory (node_t **tree)
{
    while ( *tree )
    {  
        Del ( tree ); //  Это ваша функция удаления элемента из дерева
    }
 
    exit (1);
}
Добавлено через 44 секунды
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Я бы просто выделял бы память сразу на все. Посчитал бы сколько требуется памяти на указатели + данные, выделил бы сразу, а потом проставил бы указатели.
И как же это сделать, когда заранее не знаешь кол-во узлов?
1
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:16 #6
Если сразу неизвестно количество... Думаю нужно сделать все через рекурсию, Т.е. вызываешь функцию удаления дерева, она проверяет дочерние элементы, если они не NULL(память на них выделена), но вызываем этуже функцию и для них, а затем удаляем сам элемент.
Т.е. если мы не смогли выделить память, то просто вызываем функцию удаления и все.
Если понадобится - могу набросать код.
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
22.12.2011, 17:39 #7
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Т.е. вызываешь функцию удаления дерева,
Достаточно в любой их обходов добавить в конец free
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:42 #8
Цитата Сообщение от go Посмотреть сообщение
Достаточно в любой их обходов добавить в конец free
Я не понял эту идею. Поточнее и пояснее пожалуйста.
0
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
22.12.2011, 17:55 #9
Например так
C
1
2
3
4
5
6
7
8
9
10
11
12
void iteration (node ** root)
{
    if ( *root )
    {
        iteration ( (*root)->left );
        iteration ( (*root)->right );
                free ( *root );
    }
}
 
iteration ( &tree ); // Вызов
tree = NULL;
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:59 #10
Понял, я это и имел в виду под рекурсивным удалением.
0
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
22.12.2011, 18:54 #11
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Я бы просто выделял бы память сразу на все. Посчитал бы сколько требуется памяти на указатели + данные, выделил бы сразу, а потом проставил бы указатели. Тогда и удалять стало бы легче...
Удалять и так просто.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Free(TTreeNode *&root)
{
 if (root->Left)
 {
  Free(root->Left);
 }
 if (root->Right)
 {
  Free(root->Right);
 }
 delete *root;
 root=NULL;
}, а резервировать для дерева свою кучу - как раз усложнение. При удалении - порядка на три.
1
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 535
22.12.2011, 19:17  [ТС] #12
только еще !=0 дописать в if
0
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
22.12.2011, 19:28 #13

Не по теме:

Цитата Сообщение от a.n.o.n.i.m Посмотреть сообщение
только еще !=0 дописать в if



Добавлено через 3 минуты
taras atavin, а утечки памяти не будет?
0
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
22.12.2011, 19:40 #14
Цитата Сообщение от go Посмотреть сообщение
taras atavin, а утечки памяти не будет?
Интересно, как она у тебя вообще получится?

Добавлено через 4 минуты
Цитата Сообщение от a.n.o.n.i.m Посмотреть сообщение
только еще !=0 дописать в if
Как раз не надо. Сейчас там написано условие существования узла по адресу, что правильно, а !=0 - условие на значение самого адреса, что в общем случае не правильно, так как 0 в принципе может быть и валидным, иное кроме конкретных архитектур ни где не прописано, приведение же именно указателя к bool должно учитывать, какой из адресов зарезервирован в качестве не валидного.
0
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
22.12.2011, 19:50 #15
Извиняюсь, Free с free перепутал.
тогда второй вопрос: в 11-ой строке все верно?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2011, 19:50
Привет! Вот еще темы с ответами:

Бинарное дерево - C++
Нужно записать в дерево и вывести в форматированном виде каталог файлов(типа windows) на вход даны имена файлов вида c:\win\1 ...

Бинарное дерево - C++
дано целочисленнное бинарное дерево. найти: а)количество вершин дереваж б)значение самой левой вершины в правом поддереве в)...

Бинарное дерево - C++
Подскажите алгоритм распечатки дерева на экран горизонтально, не вертикально, как обычно это делают. struct tree { int k;...

Бинарное дерево - C++
Здравствуйте, Корень создаёться вот так TREE *root=NULL; непонятно почему функия добовления использует указатель на указатель ...


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

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

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