这里我试图实现一个二叉搜索树。我在全局上下文中声明了根节点。我遵循了相同的想法,我是如何实现链表的。但是这种方法看起来并不像是在工作。我可以'我想这个代码有什么问题。任何人都可以帮我解决这个问题
#include<stdio.h>
struct node {
int data;
struct node *left;
struct node *right;
};
void insert(int value);
void push(struct node *temp,struct node *newNode);
struct node *root;
int main(){
root= NULL;
int option,value;
for(;;){
printf("Please select an option from below : \n");
printf("1 for insert\n");
printf("2 for search\n");
printf("please enter your option : ");
scanf("%d",&option);
printf("\n");
switch(option){
case 1:
printf("you choose to insert\n");
printf("input your value :");
scanf("%d",&value);
insert(value);
printf("\n");
break;
case 2:
printf("You choose to search\n");
printf("enter your value : ");
scanf("%d",&value);
search(root,value);
printf("\n");
default:
break;
}
}
}
void insert(int value){
struct node *newNode = (struct node *)malloc(sizeof(struct node));
newNode->data = value;
newNode->left = NULL;
newNode->right = NULL;
push(root,newNode);
}
void push(struct node *root_node,struct node *newNode){
if(root_node==NULL){
root_node = newNode;
printf("inserted\n\n\n");
}else{
if(root_node->data > newNode->data){
push(root_node->left,newNode);
printf("left\n");
}else{
push(root_node->right,newNode);
printf("right\n");
}
}
}
答案 0 :(得分:3)
在push()
中,root_node是本地变量:
void push(struct node *root_node,struct node *newNode){
当你这样做时:
root_node = newNode;
您只更新本地变量“root_node”,而不是全局变量:
struct node *root;
你的推()应该是这样的:
void push(struct node **root_node,struct node *newNode){
if(*root_node==NULL){
*root_node = newNode;
printf("inserted\n\n\n");
}else{
...
并致电:
push(&root, newNode);
通过这种方式,您传递root的地址,并在其中检查该地址所指向的是否为NULL。如果为null,则将newNode的地址分配给指针dereferenced。
更多解释:
struct node *root
是一个指针:一个变量,其类型是“指针/地址”。并指向数据存储器中的一个块,让我们称之为“A”。
struct node *root_node
是一个指针,作为局部变量,它是一个 COPY ,它指向数据内存中的一个块,在你的情况下(因为你传递“root”)指向“A”。
修改root_node
后,您的副本不会修改root
。你在做什么只能用来修改“A”。
你必须传递root的 地址 ,这样你才能真正修改root的值,这是一个指向“A”的指针。以这种方式,你有** root_node,它指向root
,ACTUAL root
,指向“A”,你可以指向其他地方(如你所愿)。 / p>
我上传图片以说明您的解决方案错误的原因:
如您所见,root
从未更新。
(P.S。:您可以将“复制指针”视为“复制变量”,因为指针是一个变量,其值是一个地址。并且您使用*variable
取消引用地址。
答案 1 :(得分:0)
以下行是 NOT 更新全局变量root
。
push(root,newNode);
}
void push(struct node *root_node,struct node *newNode){
if(root_node==NULL){
root_node = newNode;
printf("inserted\n\n\n");
由于您希望root
是全局的,因此可以通过以下方式更改此选项,以便使用全局root
。
push(newNode);
}
void push(struct node *newNode){
if(root == NULL){
root = newNode;
printf("inserted\n\n\n");
等等。 (注意:这不是一个完整的解决方案。)