我编写了一个简单的代码来创建元素并将其插入到二叉搜索树中,当我以下面的方式编写代码时,链接似乎没有发生,任何人都可以帮助我理解究竟发生了什么。插入功能?我知道将元素插入二叉搜索树的代码,只是想知道为什么这个元素不起作用。
#include <stdio.h>
#include<stdlib.h>
struct node {
struct node *left;
struct node* right;
int element;
};
void insert(struct node *node,int x) {
if(node==NULL) {
node=(struct node *)malloc(sizeof(struct node));
node->element=x;
node->left=NULL;
node->right=NULL;
} else {
if(x<node->element) {
insert(node->left,x);}
else {
insert(node->right,x);
}
}
}
void inorder(struct node *base) {
if(base!=NULL) {
inorder(base->left);
printf("%d ",base->element);
inorder(base->right);
}
}
int main(int argc, char *argv[]) {
struct node *base;
base=(struct node *)malloc(sizeof(struct node));
base->element=1;
base->left=NULL;
base->right=NULL;
insert(base,25);
insert(base,30);
inorder(base);
return 0;
}
如果以这种方式编写插入函数,它可以工作,但仍然不能用于创建二叉搜索树的第一个节点,混淆:/
void insert2(struct node *node,int x) {
if(node==NULL) {
node=(struct node *)malloc(sizeof(struct node));
node->element=x;
node->left=NULL;
node->right=NULL;
} else {
if(x<node->element) {
if(node->left==NULL) {
node->left=(struct node *)malloc(sizeof(struct node));
node->left->element=x;
node->left->left=NULL;
node->left->right=NULL;
} else {
insert2(node->left,x);
}
} else {
if(node->right==NULL) {
node->right=(struct node *)malloc(sizeof(struct node));
node->right->element=x;
node->right->left=NULL;
node->right->right=NULL;
} else {
insert2(node->right,x);
}
}
}
}
答案 0 :(得分:1)
将值传递给C中的函数时,您使用的是传值。这意味着该值被复制到另一个变量中,该变量变为函数的本地变量。
void change(struct node *n) {
n = 42;
}
int main(void) {
change(NULL); // change can't change the value of NULL, can it?
}
现在看一下您的insert
功能...假设我致电insert(NULL,42);
,您认为insert
是否正在尝试更改NULL
?或者它是否尝试更改某个局部变量,main
函数无法看到?
你知道还需要做什么......让你的insert
函数使用你在评论中建议的额外级别的指针间接,或者从insert
返回根节点这样您就可以将insert
所做的更改传播到main
中存储的数据结构中(使用赋值=
运算符)。
答案 1 :(得分:1)
C是按值传递。当您将某些内容传递给函数的参数时,该函数会复制它。因此,当您将struct node pointer
传递给insert
函数时,C会复制该指针。
您在main
中所做的是首先制作struct node* base
:
base --> struct node
。
当你致电insert(base, 25)
时,C会复制一份基地。所以现在你的记忆中有这样的东西:
basecpy ---> [struct node] <--- base
所以在你的insert
中,你实际上是在做
if(basecpy==NULL)
{basecpy=(struct node *)malloc(sizeof(struct node));
basecpy->element=x;
basecpy->left=NULL;
basecpy->right=NULL;}
根本不会改变base
- 只会更改basecpy
。
这可以通过使用双指针来解决:
void insert(struct node **node, int x) {
if (*node == NULL) {
*node = malloc(sizeof(*node));
(*node)->element=x;
(*node)->left=NULL;
(*node)->right=NULL;
} else {
if (x < (*node)->element) {
insert(&((*node)->left), x);
} else {
insert(&((*node)->right), x);
}
}
}
然后使用它,传入base的地址。
insert(&base, 25);
指针可能很棘手:)