138 / 138 / 39
Регистрация: 26.02.2011
Сообщений: 545
1

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

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

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

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

delete tree; не пойдет

Как это правильно реальзовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2011, 15:18
Ответы с готовыми решениями:

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

Бинарное дерево и работа с текстами. В коде возникает ошибка с работой памяти
#include <iostream> #include <fstream> #include <map> #include <string> int main() { ...

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

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

18
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
22.12.2011, 16:38 2
C
1
2
3
4
while ( tree )
{  
    Del ( &tree ); //  Это ваша функция удаления элемента из дерева
}
Просто удаляем все элементы.
0
138 / 138 / 39
Регистрация: 26.02.2011
Сообщений: 545
22.12.2011, 16:41  [ТС] 3
А если не хватило памяти при выделении?удалить то что выделили и выход как в коде реализовать?
0
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 16:45 4
Я бы просто выделял бы память сразу на все. Посчитал бы сколько требуется памяти на указатели + данные, выделил бы сразу, а потом проставил бы указатели. Тогда и удалять стало бы легче...
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:16 6
Если сразу неизвестно количество... Думаю нужно сделать все через рекурсию, Т.е. вызываешь функцию удаления дерева, она проверяет дочерние элементы, если они не NULL(память на них выделена), но вызываем этуже функцию и для них, а затем удаляем сам элемент.
Т.е. если мы не смогли выделить память, то просто вызываем функцию удаления и все.
Если понадобится - могу набросать код.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
22.12.2011, 17:39 7
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Т.е. вызываешь функцию удаления дерева,
Достаточно в любой их обходов добавить в конец free
0
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:42 8
Цитата Сообщение от go Посмотреть сообщение
Достаточно в любой их обходов добавить в конец free
Я не понял эту идею. Поточнее и пояснее пожалуйста.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
22.12.2011, 17:59 10
Понял, я это и имел в виду под рекурсивным удалением.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
138 / 138 / 39
Регистрация: 26.02.2011
Сообщений: 545
22.12.2011, 19:17  [ТС] 12
только еще !=0 дописать в if
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
22.12.2011, 19:28 13

Не по теме:

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



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

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

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

3
5
6
7

При считвании такого дерева соответственно писать об ошибки,как это в коде реализовать,можно пример?
0
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
23.12.2011, 15:47 17
Я так и не понял, что это за пример приведен. что там есть что??? И какое содержимое должно быть правильное. Приведи пример правильного написания, неправильного и объяснение ошибки записи.
0
138 / 138 / 39
Регистрация: 26.02.2011
Сообщений: 545
23.12.2011, 15:53  [ТС] 18
вот такой файл чтобы обрабатывало,извещало что неверно задан файл например
Миниатюры
Очистка памяти. Бинарное дерево.  
0
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
23.12.2011, 16:03 19
Правильный вариант в студию пожалуйста...

Добавлено через 2 минуты
Отпиши, что в твоем примере неправильно(почему должен выдавать ошибку).
0
23.12.2011, 16:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2011, 16:03
Помогаю со студенческими работами здесь

Бинарное дерево
Реализовать базу данных ГАИ по штрафным квитанциям с помощью бинарного дерева. Ключом будет...

Бинарное дерево
По заданию нужно: 1. создание дерева; 2. добавление элемента в дерево; 3. вывод дерева на экран...

Бинарное дерево
Разработать и реализовать на языке С следующие функции работой с бинарным деревом: 1. Создание...

Бинарное дерево
Всем доброго времени суток! Задача такая: Реализовать бинарное дерево в программе...

Бинарное Дерево
struct Tree { int value; Tree *l, *r; }; void add(Tree *&obj, int value) { if (obj ==...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru