我有ds代码,用于使用递归在二叉搜索树中插入值。问题是root始终保持为null。 执行时,第一个printf()打印10,但第二个printf(在insertRec(10)之后)不打印任何内容,因为root为null。
#include<stdio.h>
#include<malloc.h>
struct llist
{
int data;
struct llist *left;
struct llist *right;
};
typedef struct llist node;
void insertRec(node *r, int num)
{
if(r==NULL)
{
r=(node*)malloc(sizeof(node));
r->data=num;
r->left=NULL;
r->right=NULL; printf("%d ",r->data); //1st printf
}
else
{
if(num < r->data)
insertRec(r->left, num);
else
insertRec(r->right, num);
}
}
void display(node *x)
{
if(x != NULL)
{
display(x->left);
printf("%d-->",x->data);
display(x->right);
}
else
return;
}
int main()
{
node *root=NULL;
insertRec(root,10);
if(root !=NULL)
printf("\ndata=%d",root->data); //2nd printf
insertRec(root,5);
insertRec(root,15);
insertRec(root,3);
insertRec(root,18);
display(root);
getch();
}
答案 0 :(得分:2)
您正在传递root
作为值,因此对插入函数中的root
所做的更改不会反映在main函数中,因此root
在main函数中保持为NULL。要纠正您的代码,请need to pass Pointer to pointer。传递root
的地址以反映主要功能的变化。
void insertRec(node *r, int num)
应编码如下:
void insertRec(node **r, int num)
{
if(*r==NULL)
{
*r= malloc(sizeof(node));
(*r)->data=num;
//
并在插入函数中使用*root
。
从main中将其称为insertRec(&root, 10);
。
此外,如果您动态分配内存,那么您应该使用free显式释放已分配的内存。
还有一件事要学习Indenting C Programs。