Не удалось освободить рут в avltree

Я новичок в C и не мог четко понять указатель или некоторые другие вещи, поэтому я пытаюсь реализовать AVLTree на C, но у меня есть ошибка в моем коде. Некоторые проблемы могут показаться глупыми, но я действительно запутался в таких вещах. Для этого я хочу освободить узел в дереве AVL. Но у меня так много проблем с указателем, свободным и чем-то еще. Я надеюсь, что вы проявите терпение к моей вине.

Вот моя древовидная структура AVL:

    typedef struct AVLTreeNode {
    int key; 
    int value;  
    int height; 
    struct AVLTreeNode *parent; 
    struct AVLTreeNode *left; 
    struct AVLTreeNode *right; 
} AVLTreeNode;

typedef struct AVLTree{
    int  size;      // count of items in avl tree
    AVLTreeNode *root; // root
} AVLTree;

AVLTreeNode *newAVLTreeNode(int k, int v )
{
    AVLTreeNode *new;
    new = malloc(sizeof(AVLTreeNode));
    assert(new != NULL);
    new->key = k;
    new->value = v;
    new->height = 0; // height of this new node is set to 0
    new->left = NULL; // this node has no child
    new->right = NULL;
    new->parent = NULL; // no parent
    return new;
}

AVLTree *newAVLTree()
{
    AVLTree *T;
    T = malloc(sizeof (AVLTree));
    assert (T != NULL);
    T->size = 0;
    T->root = NULL;
    return T;
}

и моя бесплатная функция:

void destroy_avltree(AVLTreeNode *N)
 {
    if (N->left!=NULL) destroy_avltree(N->left);
    if (N->right!=NULL) destroy_avltree(N->right);
    if (N->parent && N->key < N->parent->key) N->parent->left = NULL;
    if (N->parent && N->key > N->parent->key) N->parent->right = NULL;
    free(N);
 }

// put your time complexity analysis for freeAVLTree() here
void FreeAVLTree(AVLTree *T)
{
    assert(T!=NULL);
    destroy_avltree(T->root);
    free(T);
}

Я мог бы освободить любой другой узел, кроме корневого. вот мой результат может выглядеть так:

дерево предварительного заказа: (7, 7) (3, 3) (1, 1) (0, 0) (2, 2) (5, 5) (4, 4) (6, 6) (11, 11) (9, 9) (8, 8) (10, 10) (13, 13) (12, 12) (14, 14)

после бесплатного: (39674416, 0)

Кажется, остается указатель на что-то, но я не мог понять, что не так.

Заранее спасибо!!

На что указывает T->root после вызова FreeAVLTree? И он должен указывать туда?

AShelly 01.05.2018 18:16

Спасибо за ответ! Я думал, что T-> root свободен. Cuz, если я добавлю «free (T-> root)» сразу после строки «destroy_avltree (T-> root)», это покажет «двойное освобождение или повреждение»

fender 01.05.2018 18:23

Освобождение указателя освобождает память обратно в систему - указатель не устанавливается в NULL.

AShelly 01.05.2018 18:24

большое спасибо !!! Вдруг в меня стреляет свет :) Без твоей помощи не разобрался.

fender 01.05.2018 18:29

@AShelly У меня еще один вопрос по указателю в этой программе. Удобно ли беспокоить вас за помощью?

fender 01.05.2018 18:30

просто для других приходят к этому вопросу: я добавил T-> root = NULL; бесплатно (T-> root); после destroy_avltree (T-> root); и работает :)

fender 01.05.2018 18:34

Вам следует заменить new другим именем.

Michi 01.05.2018 18:42

@ Мичи, извини? Что ты имеешь в виду? Не могли бы вы объяснить это более четко?

fender 01.05.2018 18:45

@fender Конечно могу, но пожалуйста прочтите это в первую очередь и Этот

Michi 01.05.2018 18:47

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

fender 01.05.2018 18:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
66
0

Другие вопросы по теме