这是插入数字的非常简单的示例。
typedef struct node {
int data;
struct node *left, *right;
} node;
node * newNode(int val) {
node* n = malloc(sizeof(node));
n->data=val;
n->left=NULL;
n->right=NULL;
return n; }
void insert(node* node, int key) {
if (node == NULL)
node = newNode(key);
}
int main() {
node *root = NULL;
insert(root, 5);
printf("%d\n", root->data);
return 0;
}
问题是,为什么当我在printf
中插入5时root
什么都不打印?
在C中,所有参数都传递按值”。这意味着该值被copied放入参数变量,并且当您执行分配node = newNode(key);
时,您仅分配给本地node
变量。
对此问题有两种解决方案:
Return改为新节点:
node* insert(node* the_node, int key) {
if (the_node == NULL)
the_node = newNode(key);
return the_node;
}
...
root = insert(root, 5);
仿真通过引用传递,可以通过使用地址运算符&
传递指向变量的指针来完成:
void insert(node** the_node, int key) {
if (*the_node == NULL)
*the_node = newNode(key);
}
...
insert(&root, 5);
您已按值将指针root
传递给函数insert
。您可以通过以下方式想象函数声明及其调用]