我正在创建一个代码以在树中插入元素,但tinsert
函数不插入;我的代码出了什么问题?我已经检查了很多次但是树总是为NULL。
代码只有两个函数:一个用于插入,第二个用于预先显示。
#include<stdio.h>
#include<stdlib.h>
struct btree {
int val;
struct btree *left;
struct btree *right;
};
static int c=0;
typedef struct btree node;
void tinsert( node *n,int a)
{
c++;
printf("%d\n",c);
if(n==NULL)
{
n=(node *)malloc(sizeof(node));
n->left=NULL;
n->right=NULL;
n->val=a;
//printf("adding root %d\n",n->val);
//n=temp;
}
else if(a>=(n->val))
tinsert(n->right,a);
else
tinsert(n->left,a);
return ;
}
void preorder_display(node *n)
{
if(n!=NULL)
{
printf("%d\n",n->val);
preorder_display(n->left);
preorder_display(n->right);
}
else
printf("tree is null\n");
}
int main()
{
//int N;
//int num[100];
//int i;
node *ntree=NULL;
tinsert(ntree,4);
tinsert(ntree,6);
tinsert(ntree,8);
tinsert(ntree,1);
printf("tree is \n");
preorder_display(ntree);
return 0;
}
答案 0 :(得分:2)
tinsert
适用于ntree
的本地副本,但不会更改main
中的副本。您可以通过传递指针来修复它(即:双指针,指向指针的指针)。
因此,您的tinsert
将如下所示:
void tinsert( node **n,int a)
在你的main
中,你会这样称呼它:
tinsert(&ntree,4);
当然,您需要调整tinsert
中的代码以取消引用指针并正确访问它。
或者在main
。
答案 1 :(得分:0)
您将根节点ntree
按值传递给tinsert
函数,因此当函数完成时,您将保留原始值ntree
NULL
。
你最好重写你的函数,所以你将指针传递给指针
void tinsert( node **n,int a)
//and invocation is like that :
tinsert(&ntree,4);
答案 2 :(得分:0)
当你将ntree从main传递给tinsert函数时, 将新副本创建到您的节点* n;
一种方法是使用指向指针的指针 或者第二个解决方案在这里:
这是一个解决方案:
#include<stdio.h>
#include<stdlib.h>
struct btree{
int val;
struct btree *left;
struct btree *right;
};
static int c=0;
typedef struct btree node;
node* tinsert( node *n,int a)
{
c++;
printf("%d\n",c);
if(n==NULL)
{
n=(node *)malloc(sizeof(node));
n->left=NULL;
n->right=NULL;
n->val=a;
//printf("adding root %d\n",n->val);
//n=temp;
}
else if(a>=(n->val))
tinsert(n->right,a);
else
tinsert(n->left,a);
return n;
}
void preorder_display(node *n)
{
if(n!=NULL)
{
printf("%d\n",n->val);
preorder_display(n->left);
preorder_display(n->right);
}
else
printf("tree is null\n");
}
int main()
{
//int N;
//int num[100];
//int i;
node *ntree=NULL;
ntree=tinsert(ntree,4);
ntree=tinsert(ntree,6);
ntree=tinsert(ntree,8);
ntree=tinsert(ntree,1);
printf("tree is \n");
preorder_display(ntree);
return 0;
}
答案 3 :(得分:0)
C仅支持pass by value
。但是,这并不妨碍您从另一个函数修改变量的值,因为您始终可以使用它的内存来引用变量;在C中它通过pointers
完成,这是一个代表内存位置的抽象。
将值传递给函数时,实际参数的值将复制到formal参数的值。请注意,指针的值是它指向的地址。因此,此值将复制到形式参数中。因此函数内的新指针指向原始变量的完全相同的位置。您可以随时使用指针来操纵它的值。
在这里,您需要操纵指针。所以你将一个指向指针的指针传递给函数:
tinsert(&ntree,4);
在你的函数中,你需要它来获得原始指针;如下:
void tinsert(node **n, int a)
{
//...
*n = malloc(sizeof(node));
//...
}