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

Функция удаления элемента из дерева, ошибка в коде - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ решение систем обыкновенных дифференциальных уравнений на си++ http://www.cyberforum.ru/cpp-beginners/thread887575.html
вот задание
C++ Написать программу проверки синтаксиса в логических операциях На с++ нужно написать программу проверки синтаксиса в логических операциях,очень срочно http://www.cyberforum.ru/cpp-beginners/thread887555.html
Есть ли утечка памяти в этом случае? C++
_Доброго денёчка всем. Прохожу тему на указатели и ссылки. Делаю упражнение на тему "написать программу, вызывающую утечку памяти". Смысл идеи "учись на ошибках и запомни как делать не нуна, а то будет ай-ай-ай". В книге приведён пример такой логической ошибки, когда в функции выполняется создание экземпляра класса, для которого оператором new в функции выделяется память. Затем ссылка на объект...
C++ Определить число нулей и единиц в массиве
диапазон изменения значений элементов массива 0 или 1 Сделать два варианта программы: -элементы массива задаются пользователем -заполняются с помощью генератора случайных чисел
C++ Определить число нулей и единиц в массиве http://www.cyberforum.ru/cpp-beginners/thread887541.html
диапазон изменения значений элементов массива 0 или 1 Сделать два варианта программы: -элементы массива задаются пользователем -заполняются с помощью генератора случайных чисел
C++ Какую роль выполняют идентификаторы в приведенном коде? Подскажите пожалуйста,какие в данной задаче идентификаторы и их назначение в ней. #include <iostream> #include <algorithm> #include <vector> #include <iterator> #include <cassert> using namespace std; int main() подробнее

Показать сообщение отдельно
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
02.06.2013, 11:10     Функция удаления элемента из дерева, ошибка в коде
Добрый вечер, уважаемые программисты!
Помогите, пожалуйста, понять где здесь ошибка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
static bool h = false;
 
// узел дерева
struct Tree
{
    int znachlist; // значение узла\листа
    int balance; // фактор баланса: высота правого поддерева - высота левого
    Tree *left, *right; // левое и правое поддерево
};
 
void search_and_delete (int *sel,Tree** rr);
void Balance_R(Tree** rr);
void Balance_L(Tree** rr);
void deldel(Tree** q);
 
void main()
{
    setlocale(0,"");
    h = false;
    int* sdf = new int; // элемент, который будет удалять
    cout << "\n\nкакой элемент удаляем?\n";
    cin >> *sdf;
    search_and_delete(sdf,&root);
    delete sdf;
 
    cin.get();
    cin.get();
}
 
 
// поиск и удаление элемента
void search_and_delete (int *sel,Tree** rr)
{
    //h = false; // изначально устанавливаем флаг как "высота не изменилась"
    Tree **q;  //сохранение указателя на удаляемый узел
    Tree **w; // указатель на узел "левый из правых"
    //h = false;
    if (*rr == NULL)
    {
        cout << "Такого удаляемого элемента в дереве нет";
    }
    else
    {
        if (*sel < (*rr)->znachlist)
        {
            search_and_delete (sel,&(*rr)->left); //далее  по левому поддереву
            if (h==true)
            {
                Balance_L(&(*rr));
            }
        }
        else
        {
            if (*sel > (*rr)->znachlist)
            {
                search_and_delete (sel,&(*rr)->right); //далее  по правому поддереву
                if (h==true)
                {
                    Balance_R(&(*rr));
                }
            }
            else // нашли нужный нам элемент
            {
                q=rr; // q - хранит в себе адрес "удаляемого элемента"
                //место ошибки?
                if ((*rr)->right==NULL) // у удаляемого узла имеется только левое поддерево, тогда
                {
                    *rr=(*rr)->left;
                    h=true;
                }
                else
                {
                    if ((*rr)->left==NULL) // у удаляемого узла есть только правое поддерево
                    {
                        *rr=(*rr)->right;
                        h=true;
                    }
                    else // у удаляемого узла есть два поддерева (леов еи правое)
                    {
                        deldel (q);
                        if (h==true)
                        {
                            Balance_L(&(*rr));
                        }
                    }
                }
                delete q;
            }
        }
    }
}
 
 
void deldel (Tree **q)
{//выполняем поиск самого правого узла в левом поддереве
    Tree** w=q;
    if ((*w)->right != NULL)//спуск по правому поддереву
    {
        deldel (&(*w)->right);
    }
    if (h==true)
    {
        Balance_R(w); //возврат по пути спуска по правому поддереву и, если нужно, балансировка
    }
    else //заменяем значения удаляемого и самого правого в левом поддереве
    {
        (*q)->znachlist=(*w)->znachlist;
        *q=*w;
        *w=(*w)->left; // у самого правого элемента может быть левый лист, поэтому нужно поднять этот левый лист на месте переносимого узла
        h=true;
    }
}

Ошибка возникает, когда проводим функцию delete q. Уходим куда-то в бесконечность.
Может быть ошибка в функции void deldel(Tree** q); ?

Пожалуйста, помогите разобраться с ошибкой))))

Добавлено через 27 минут
upp))

Добавлено через 1 час 24 минуты
Пожалуйста, помогите с ошибкой

Добавлено через 13 часов 14 минут
upp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 15:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru