Форум программистов, компьютерный форум CyberForum.ru

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

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

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

delete tree; не пойдет

Как это правильно реальзовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2011, 15:18     Очистка памяти. Бинарное дерево.
Посмотрите здесь:

C++ Бинарное дерево
Бинарное дерево C++
Бинарное дерево C++
Бинарное дерево C++
C++ Бинарное дерево
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
22.12.2011, 16:38     Очистка памяти. Бинарное дерево. #2
C
1
2
3
4
while ( tree )
{  
    Del ( &tree ); //  Это ваша функция удаления элемента из дерева
}
Просто удаляем все элементы.
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
22.12.2011, 16:41  [ТС]     Очистка памяти. Бинарное дерево. #3
А если не хватило памяти при выделении?удалить то что выделили и выход как в коде реализовать?
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 16:45     Очистка памяти. Бинарное дерево. #4
Я бы просто выделял бы память сразу на все. Посчитал бы сколько требуется памяти на указатели + данные, выделил бы сразу, а потом проставил бы указатели. Тогда и удалять стало бы легче...
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
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 Посмотреть сообщение
Я бы просто выделял бы память сразу на все. Посчитал бы сколько требуется памяти на указатели + данные, выделил бы сразу, а потом проставил бы указатели.
И как же это сделать, когда заранее не знаешь кол-во узлов?
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:16     Очистка памяти. Бинарное дерево. #6
Если сразу неизвестно количество... Думаю нужно сделать все через рекурсию, Т.е. вызываешь функцию удаления дерева, она проверяет дочерние элементы, если они не NULL(память на них выделена), но вызываем этуже функцию и для них, а затем удаляем сам элемент.
Т.е. если мы не смогли выделить память, то просто вызываем функцию удаления и все.
Если понадобится - могу набросать код.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
22.12.2011, 17:39     Очистка памяти. Бинарное дерево. #7
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Т.е. вызываешь функцию удаления дерева,
Достаточно в любой их обходов добавить в конец free
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:42     Очистка памяти. Бинарное дерево. #8
Цитата Сообщение от go Посмотреть сообщение
Достаточно в любой их обходов добавить в конец free
Я не понял эту идею. Поточнее и пояснее пожалуйста.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
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;
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:59     Очистка памяти. Бинарное дерево. #10
Понял, я это и имел в виду под рекурсивным удалением.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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;
}, а резервировать для дерева свою кучу - как раз усложнение. При удалении - порядка на три.
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
22.12.2011, 19:17  [ТС]     Очистка памяти. Бинарное дерево. #12
только еще !=0 дописать в if
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
22.12.2011, 19:28     Очистка памяти. Бинарное дерево. #13

Не по теме:

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



Добавлено через 3 минуты
taras atavin, а утечки памяти не будет?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.12.2011, 19:40     Очистка памяти. Бинарное дерево. #14
Цитата Сообщение от go Посмотреть сообщение
taras atavin, а утечки памяти не будет?
Интересно, как она у тебя вообще получится?

Добавлено через 4 минуты
Цитата Сообщение от a.n.o.n.i.m Посмотреть сообщение
только еще !=0 дописать в if
Как раз не надо. Сейчас там написано условие существования узла по адресу, что правильно, а !=0 - условие на значение самого адреса, что в общем случае не правильно, так как 0 в принципе может быть и валидным, иное кроме конкретных архитектур ни где не прописано, приведение же именно указателя к bool должно учитывать, какой из адресов зарезервирован в качестве не валидного.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
22.12.2011, 19:50     Очистка памяти. Бинарное дерево. #15
Извиняюсь, Free с free перепутал.
тогда второй вопрос: в 11-ой строке все верно?
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
23.12.2011, 15:43  [ТС]     Очистка памяти. Бинарное дерево. #16
Есть еще вопрос,чтобы новую тему не открывать

вот есть файл в нем содержимое

3
5
6
7

При считвании такого дерева соответственно писать об ошибки,как это в коде реализовать,можно пример?
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
23.12.2011, 15:47     Очистка памяти. Бинарное дерево. #17
Я так и не понял, что это за пример приведен. что там есть что??? И какое содержимое должно быть правильное. Приведи пример правильного написания, неправильного и объяснение ошибки записи.
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
23.12.2011, 15:53  [ТС]     Очистка памяти. Бинарное дерево. #18
вот такой файл чтобы обрабатывало,извещало что неверно задан файл например
Миниатюры
Очистка памяти. Бинарное дерево.  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2011, 16:03     Очистка памяти. Бинарное дерево.
Еще ссылки по теме:

C++ бинарное дерево
C++ Бинарное дерево с++
C++ Бинарное дерево

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

Или воспользуйтесь поиском по форуму:
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
23.12.2011, 16:03     Очистка памяти. Бинарное дерево. #19
Правильный вариант в студию пожалуйста...

Добавлено через 2 минуты
Отпиши, что в твоем примере неправильно(почему должен выдавать ошибку).
Yandex
Объявления
23.12.2011, 16:03     Очистка памяти. Бинарное дерево.
Ответ Создать тему
Опции темы

Текущее время: 08:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru