如何使用双指针释放树结构?
How to free a tree struct using double pointer?
我必须释放一棵树并使用特定函数将其根设置为 NULL。我尝试使用递归方法。但是如果我编译我会收到一些关于 "incompatible pointer type" 的警告并且我无法解决它。这是结构:
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;
}
如有任何帮助,我们将不胜感激
你的问题不能很清楚地回答,但至少我可以告诉你为什么你有关于 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 **
您的函数需要一个指向节点指针的指针。您在递归调用中三次给它一个指向节点的指针。此外,您没有验证指向指针的指针 和 它指向的指针是否为非空;你只是在验证前者。
简而言之,您的函数应如下所示:
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
我必须释放一棵树并使用特定函数将其根设置为 NULL。我尝试使用递归方法。但是如果我编译我会收到一些关于 "incompatible pointer type" 的警告并且我无法解决它。这是结构:
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;
}
如有任何帮助,我们将不胜感激
你的问题不能很清楚地回答,但至少我可以告诉你为什么你有关于 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 **
您的函数需要一个指向节点指针的指针。您在递归调用中三次给它一个指向节点的指针。此外,您没有验证指向指针的指针 和 它指向的指针是否为非空;你只是在验证前者。
简而言之,您的函数应如下所示:
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