Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302

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

02.06.2013, 11:10. Показов 1806. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, уважаемые программисты!
Помогите, пожалуйста, понять где здесь ошибка.

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
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2013, 11:10
Ответы с готовыми решениями:

Функция удаления элемента из дерева
В данной программе реализовано почти все,кроме фунции удаления,которую я так и не смог реализовать. Руководствуюсь методами: -если это...

Функция для удаления элемента в двумерном динамическом массиве. В чем ошибка?
функция для удаления элемента в двум дин массиве (пока только часть в которой указывается какой надо удалить элемент). пишет IntelliSense:...

TreeView Отследить удаления элемента дерева
Необходимо, когда удаляется элемент из дерева, выполнить некоторые действия, связанные с освобождением ресурсов, связанных с данным узлом:...

4
1 / 1 / 0
Регистрация: 29.05.2012
Сообщений: 11
02.06.2013, 11:21
Я вот что-то у тебя объявления root не вижу.
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
02.06.2013, 11:29  [ТС]
Ой, оно в мэйне есть, случайно с этого кода удалила:

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
void main()
{
    setlocale(0,"");
    int i;
    Tree *root = NULL; // указатель на корень дерева равен NULL
    for (i=0; i<20; i++)
    {
        int* asas = new int; // вводимое значение для дерева
        cin >> *asas;
        search_and_add(asas, &root);
        delete asas;
    }
    printWithLvls (root,0);
    
 
    h = false;
 
    int* sdf = new int; // элемент, который будет удалять
    cout << "\n\nКакой элемент удаляем?\n";
    cin >> *sdf;
    search_and_delete(sdf,&root);
    delete sdf;
 
    printWithLvls (root,0);
 
    cin.get();
    cin.get();
}

Проблема в том, что я просматриваю через точки останова, и выходит вот такая штука: нашли удаляемый элемент, заменили значения, всё шик и блеск и когда функция (search_and_delete) выходит к своему самому-самому концу, она пишет:

Необработанное исключение в "0x77e415de" в "функция удаления авл дерево.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfeeefefa".
что делать и как быть?

Я уже думаю, что пробелма в указателях, т.е., когда нужно удалить листик, а значение родителя и листика после выполнения функции (по алгоритму) совпадают, может указатели не меняются, и пограмма удаляет родителя, а не листик? А если удаляет листик, то чего ж она "не обрабатывает" что-то там.... В общем, это единственная проблема и мне бы очень хотелось её решить.
0
1 / 1 / 0
Регистрация: 29.05.2012
Сообщений: 11
02.06.2013, 11:43
А в какой именно строке пишет ? + Если не сложно, не могли бы вы привести весь код ?

Добавлено через 3 минуты
C++
1
delete q
Попробуйте
C++
1
delete (*q)
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
02.06.2013, 11:58  [ТС]
Perfecter, вы знаете, кажется, я нашла "где именно идёт ошибка".
т.е., у меня есть функция вывода дерева, когда пишет про ошибку, то выводит ту функцию. Я уже заменила "переменные", но он всё равно указывает на функцию печати.

И уже пишет про "там ошибка, тааааам".

И правда там. Удалила я, значит, в конце эту "функцию печати того, что получилось" и что? Вроде бы дерево "удалило", но мне не проверить, удалило оно или нет. Т.е., программа работает корректно, но без итогового вывода. хм-хм-хм, что делать?)))


Вот

специфический красивый вывод дерева помог таки найти "причину ошибки"))

Да, я была права. Значит проблема ошибки такая допустим, у меня есть дерево, и я удаляю в середине элемент, который является "узлом" с двумя детками. Всё бы ничего, но вот мой вывод печати показал: правую половину распечатал, дошёл до корня, напечатал корень, а когда надо бы дойти до след. элемента, который мы удаляли, он и пишет про ошибку, всё-таки это была проблема с указателями из тех функций.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.06.2013, 11:58
Помогаю со студенческими работами здесь

Написать подпрограмму удаления элемента из бинарного дерева
...

Функция удаления листа (или ветки) бинарного дерева
Здравствуйте программисты! Учусь на первом курсе. Возникли проблемы с разработкой функции удаления ветки листа или корня из дерева. Т.е....

Функция удаления всех четных элементов AVL-дерева
Помогите допилить функцию удаления всех парных элементов АВЛ дерева. Она сейчас удаляет только элементы, которые находятся в правой...

В чем ошибки в коде добавления и удаления элемента из очереди?
В идеале должно производиться добавление и удаление элемента из очереди ...

Функция удаления элемента структуры
Здравствуйте, в этой функции может удаляться любой элемент, кроме первого, как это можно исправить, все перепробовал, нечего не получается,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru