【问题标题】:How to free a tree struct using double pointer?如何使用双指针释放树结构?
【发布时间】:2018-09-04 09:22:54
【问题描述】:

我必须释放一棵树并使用特定函数将其根设置为 NULL。我尝试使用递归方法。但是如果我编译我会收到一些关于“不兼容的指针类型”的警告,我无法解决它。这是结构:

typedef struct node {
int key; 
struct node *left, *mid, *right;
} node_t;

这里是函数。第一行不能改:

void free_tree (node_t ** root){
if(root != NULL){
    free_tree((*root)->left);
    free_tree((*root)->mid);
    free_tree((*root)->right);
    free(*root);
    }
return;
}

任何帮助将不胜感激

【问题讨论】:

  • 欢迎来到 stackoverflow.com。请花一些时间阅读the help pages,阅读the SO tour,阅读有关how to ask good questions 的信息,同时阅读this question checklist。最后请学习如何创建Minimal, Complete, and Verifiable Example
  • 另外,当询问有关构建错误或警告的问题时,请完整完整地包含您通过复制粘贴获得的确切消息作为文本。并标出(使用 cmets)在代码中出现错误或警告的位置。
  • 所有这些指针都应该通过地址传递;您在递归调用中按值传递它们。例如:free_tree((*root)->left) 应该是 free_tree(&(*root)->left)。这让我相信,free_tree 的初始调用者很可能也是错误的,但我们不方便地没有得到该代码的祝福。最后,您应该在递归之前检查root*root
  • 最后提示您的问题:(*root)->left 的类型是什么? free_tree 期望的类型是什么?
  • @SandeepKokate 当然,谢谢。

标签: c pointers tree double-pointer


【解决方案1】:

您的函数需要一个指向节点的指针。您在递归调用中三次为其提供指向节点的指针。此外,您没有验证指向指针的指针 它指向的指针是否为非空;你只是在验证前者。

简而言之,你的函数应该是这样的:

void free_tree (node_t ** root)
{
    if(root && *root)
    {
        free_tree(&(*root)->left);
        free_tree(&(*root)->mid);
        free_tree(&(*root)->right);
        free(*root);
        *root = NULL;
    }
}

最后一个功能行是可选的,但坦率地说,用指针指向指针是没有意义的,除非你无论如何都要这样做,因为它在删除树之后将调用者的指针设置为 NULL。给定一棵正确构建的树,您的调用者应该在销毁整棵树时传递树根的地址,如下所示:

node_t *root = NULL;

// ... build tree ...

free_tree(&root);

// root is now NULL; tree is destroyed

【讨论】:

  • 我想我已经理解了这个问题。我会尝试自己编写代码。但我真的很高兴你的帮助。
【解决方案2】:

你的问题不能很清楚地回答,但至少我可以告诉你为什么你有这个关于incompatible pointer type的警告:

你的函数原型是

void free_tree (node_t ** root);

它的参数是node_t **

你的结构是

typedef struct node {
    int key; 
    struct node *left, *mid, *right;
} node_t;

所以在你的功能中:

void free_tree (node_t ** root)
{
    if(root != NULL)
    {
        free_tree((*root)->left);   <<< '(*root)->left' is of type 'node_t *'
        free_tree((*root)->mid);    <<< '(*root)->mid' is of type 'node_t *'
        free_tree((*root)->right);  <<< '(*root)->right' is of type 'node_t *'
        free(*root);
    }
    return;
}

你调用你的函数给一个node_t *作为参数,而你的函数需要一个node_t **

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2016-04-01
    • 2021-08-07
    • 1970-01-01
    • 2013-10-31
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多