我正在努力尝试在C中实现二进制搜索树,并遇到过这个问题。我已经使我的插入函数为void类型,因此我没有一个变量来指定此回调的值。当我运行程序时,我没有看到任何输出。这是否与我有关,一旦它从NULL更改为指向值,就不会分配我的根节点指针?
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *left, *right;
}Node;
void addToNode(Node *A, int value)
{
A->data=value;
A->left=NULL;
A->right=NULL;
}
void insert(Node *A, int value)
{
if(A==NULL)
{
A = (Node*)malloc(sizeof(Node));
addToNode(A, value);
// printf("Hello\n");
return;
}
else
{
if(value>A->data)
{
insert(A->right, value);
// printf("Hello\n");
return;
}
else if(value<A->data)
{
insert(A->right, value);
// printf("Hello\n");
return;
}
}
}
void inorder(Node *root)
{
if (root != NULL)
{
// printf("Hello\n");
inorder(root->left);
printf("%d \n", root->data);
inorder(root->right);
}
}
int main()
{
Node *root = NULL;
int A[]={45,32,56,23,11,89};
for(int i=0; i<6; i++) insert(root,A[i]);
inorder(root);
}
答案 0 :(得分:0)
问题不在于你的函数是void
,而是它取值根指针而不是指针。这就是为什么这个任务
A = (Node*)malloc(sizeof(Node));
仍然是insert
功能的本地地址; <{1}}的变量root
仍然未分配。
修改函数以通过指针获取节点:
main
现在,void insert(Node **A, int value) {
if(*A == NULL) {
*A = malloc(sizeof(Node));
addToNode(*A, value);
return;
}
Node *root = *A;
if (value > root->data) {
insert(&root->right, value);
} else if (value < root->data) {
insert(&root->left, value);
}
}
中的来电看起来像main
,因此作业insert(&root, A[i]);
会根据需要修改*A = malloc(sizeof(Node))
。
答案 1 :(得分:0)
您应该将Node
作为指针传递给指针。因为你想对指针本身进行更改。
void insert(Node **A, int value)
{
if(*A==NULL)
{
*A = (Node*)malloc(sizeof(Node));
addToNode(*A, value);
// printf("Hello\n");
return;
}
else
{
if(value>(*A)->data)
{
insert(&(*A)->right, value);
// printf("Hello\n");
return;
}
else if(value<(*A)->data)
{
insert(&(*A)->left, value);
// printf("Hello\n");
return;
}
}
}