Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法释放avltree中的根_C_Pointers_Tree_Free - Fatal编程技术网

C 无法释放avltree中的根

C 无法释放avltree中的根,c,pointers,tree,free,C,Pointers,Tree,Free,我是C语言的新手,对指针或其他一些东西不太了解,所以我试图用C语言实现一个AVLTree,但我的代码中有错误。有些问题可能是愚蠢的,但我真的对这些事情感到困惑。对于这个,我想释放AVL树中的节点。但是我在使用指针、自由和其他东西时遇到了很多困难。我希望你能容忍我的错误 以下是我的AVL树结构: typedef struct AVLTreeNode { int key; int value; int height; struct AVLTreeNod

我是C语言的新手,对指针或其他一些东西不太了解,所以我试图用C语言实现一个AVLTree,但我的代码中有错误。有些问题可能是愚蠢的,但我真的对这些事情感到困惑。对于这个,我想释放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);
}
void destroy\u avltree(AVLTreeNode*N)
{
如果(N->left!=NULL)销毁_avltree(N->left);
如果(N->right!=NULL)销毁_avltree(N->right);
如果(N->parent&&N->keyparent->key)N->parent->left=NULL;
如果(N->parent&&N->key>N->parent->key)N->parent->right=NULL;
自由(N);
}
//将freeAVLTree()的时间复杂性分析放在此处
void FreeAVLTree(AVLTree*T)
{
断言(T!=NULL);
销毁_avltree(T->root);
自由(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)

它似乎仍然是某事物的指针,但我不知道出了什么问题


提前谢谢

调用
FreeAVLTree
后,
T->root
指向什么?它应该指向那里吗?谢谢你的回复!我以为T->root被释放了。因为如果我在“destroy_avltree(T->root)”行之后添加“free(T->root)”,它会显示“double free or corruption”释放指针会将内存释放回系统-它不会将指针设置为NULL。非常感谢!!!突然,光线射向我:)没有你的帮助,我想不出来。@AShelly我还有一个关于这个程序中指针的问题。麻烦你帮忙方便吗?