释放C中的链接结构

时间:2011-03-29 19:47:14

标签: c data-structures memory-management struct free

好的,所以我有一个仅使用C结构和指针构建的二进制搜索树,因为我疯了而且不想使用C ++。无论如何,我有一些严重的内存泄漏,因为我 假设 free(tree),树是下面结构的一个实例,并没有释放所有的那棵树的孩子们。

这是我的节点:

struct node{
    struct node* parent;
    struct node* left;
    struct node* right;
    int key; //the value of the node
};

这是我的bst:

struct bst{
    struct node* root;
    int elements; //number of nodes in the bst
};

所以我的问题是,有没有比递归调用删除函数更好的方法呢?例如(当场写下):

void delete_tree(struct node* n){
    if(n == NULL) return;
    struct node* left = n->left;
    struct node* right = n->right;
    free(n);
    delete_tree(left);
    delete_tree(right);
}

2 个答案:

答案 0 :(得分:5)

我认为递归删除绝对没有错。您可以使用迭代方法,但它不会有任何可辨别的好处,并且更难写。

顺便说一句,您可以稍微简化代码并删除两个局部变量:

void delete_tree(struct node* n){
    if(n == NULL) return;
    delete_tree(n->left);
    delete_tree(n->right);
    free(n);
}

答案 1 :(得分:2)

您正在进行递归调用但从未实际调用free。您可能需要验证节点是否为叶节点(可能询问两个子节点是否为空)并在该节点上调用free