我有以下递归函数,该递归函数应该调用自身以引用方式传递指针。
如何取消引用tmproot->left
和tmproot->right
以便将其传递给tree_input()
?
typedef struct node_s {
int value;
struct node_s *left;
struct node_s *right;
} node_t;
node_t new_node() {
node_t *new_node = (node_t*)malloc(sizeof(node_t));
new_node->left = NULL;
new_node->right = NULL;
return *new_node;
}
void tree_input(int value, node_t **tmproot)
{
if (*tmproot == nullptr) {
node_t *node = &new_node();
node->value = value;
}
else if (value < (*tmproot)->value) {
tree_input(value, tmproot->left);
}
else if (value >= value) {
tree_input(value, tmproot->right);
}
return;
}
第一次使用tree_input()
调用 tree_input(new_value, &root);
我确定我错过了一个简单的技巧。
答案 0 :(得分:2)
要回答以下问题:
void tree_input()
将指向该对象的指针作为参数,而node_s->left
是一个指针。因此,您要做的就是使用操作数的地址获取指向该指针的指针。
但是,由于tmproot
是一个指向指针的指针,因此在使用->
运算符之前还需要对其进行一次取消引用。
tree_input(value, &(*tmproot)->left);
但是,您还应该知道new_node()
函数以及如何使用它已经损坏了。
现在设置的方式是,在堆上创建一个新的node_t
,将其复制到堆栈上,然后将指向该堆栈实例的指针存储在树中,该指针在堆中立即变为悬空指针分配的内存只会泄漏掉。
要修复此问题,该函数应返回node_t*
,而不是node_t
。其他一切都应该自然地流向那里。