Я новичок в 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 свободен. Cuz, если я добавлю «free (T-> root)» сразу после строки «destroy_avltree (T-> root)», это покажет «двойное освобождение или повреждение»
Освобождение указателя освобождает память обратно в систему - указатель не устанавливается в NULL.
большое спасибо !!! Вдруг в меня стреляет свет :) Без твоей помощи не разобрался.
@AShelly У меня еще один вопрос по указателю в этой программе. Удобно ли беспокоить вас за помощью?
просто для других приходят к этому вопросу: я добавил T-> root = NULL; бесплатно (T-> root); после destroy_avltree (T-> root); и работает :)
Вам следует заменить new
другим именем.
@ Мичи, извини? Что ты имеешь в виду? Не могли бы вы объяснить это более четко?
@fender Конечно могу, но пожалуйста прочтите это в первую очередь и Этот
конечно, спасибо за рекомендацию. я плохо разбираюсь в основах теории, я прочитаю это
На что указывает
T->root
после вызоваFreeAVLTree
? И он должен указывать туда?