我有这段代码:
node* free_tree(node *root){
if(root != NULL){
free_tree(root->left);
free_tree(root->right);
free(root->name);
free(root);
}
return NULL;
}
我知道这不正确,正确的版本是:
root -> left = free_tree(root->left);
root -> right = free_tree(root->right);
我不明白的是,为什么这样做?当我从free_tree(root->left)
返回NULL时,我的函数需要一些
node*
收到NULL值,这不是这里的情况,所以我不明白,为什么这样做?为什么这不是编译错误?
答案 0 :(得分:6)
一些事情:
没有理由为什么这个功能需要返回任何东西。您显示的第二个版本使用返回值在释放它们之前更新左右指针,但是(a)没有必要,因为您无论如何都要释放节点,并且(b)值总是NULL
。由于它是一个常数,因此没有理由退货。
没有编译错误,因为没有类型违规。唯一的问题是您正在调用一个函数,该函数返回node *
但不使用返回值。但是,这是合法的C.
答案 1 :(得分:2)
您正在删除整个树,除了应该设置为NULL的根指针(或者根本不是那个,取决于实现),节点的成员不必设置为NULL。
您的正确代码与:
相同node* free_tree(node *root){
if(root != NULL){
free_tree(root->left);
free_tree(root->right);
root->left = NULL;
root->right = NULL;
free(root->name);
free(root);
}
return NULL;
}
正如您在成员left
和rigth
设置为NULL后所看到的那样,整个节点都是free
d。因此,就程序的正确性而言,他们的价值观并不重要。
答案 2 :(得分:1)
这些功能并不需要分配。如果不需要,该值就会被丢弃。
int OutputSquareValue(int value) {
int result = value * value;
printf("%d", result);
return result;
}
如果您不想在代码中使用结果,但只想让它输出,那么
OutputSquareValue(5);
这完全没问题。如果您需要使用新值,请转到
printf("Squre of %d = ", x);
y = OutputSquareValue(x);
printf("%d^4 =", x);
OutputSquareValue(y);