当我尝试在二叉树中添加一个数字时,会出现着名的分段错误。
我猜错误是函数inserir_no
中的指针。也许我应该使用指针aux。
#include <stdio.h>
#include <stdlib.h>
/* create a node */
struct no {
int info;
struct no *esq;
struct no *dir;
};
/* function prototypes */
void inserir_no(struct no *arv, int x);
void inserir_no(struct no *arv, int x)
{
if(arv == NULL) {
printf("foi");
arv = (struct no *) calloc(1, sizeof(struct no));
arv->info = x;
arv->esq = NULL;
arv->dir = NULL;
}
else if(x < arv->info) {
inserir_no(arv->esq, x);
}
else {
inserir_no(arv->dir, x);
}
}
int main(void)
{
struct no *a;
int valor;
a = NULL;
/* fazer um menu depois */
scanf("%d", &valor);
inserir_no(a, valor);
printf("\nDADOS:\n%d", a->info);
return 0;
}
答案 0 :(得分:4)
问题在于您在插入函数中对arv
所做的更改
if(arv == NULL) {
printf("foi");
arv = (struct no *) calloc(1, sizeof(struct no));
arv->info = x;
arv->esq = NULL;
arv->dir = NULL;
}
不要更改调用方中的传入指针。函数接收的是存储在调用者变量中的地址的副本,因此只有在calloc
内存时才会覆盖该副本。
要使函数更改调用者中的变量,请使其指向指针
void inserir_no(struct no **arv, int x);
并传递指针的地址。
inserir_no(&a, valor);
<{1>}中的和
main
在递归调用中,以及
else if(x < arv->info) {
inserir_no(&(*arv)->esq, x);
}
else {
inserir_no(&(*arv)->dir, x);
}
答案 1 :(得分:0)
在a
的最后printf()
之前检查main()
的值,它仍然是NULL
。您需要将a
的引用传递给您分配给main()
在函数inserir_no()
中,您需要更新以获取指向struct no
的指针:
void inserir_no(struct no **arv, int x)
在函数本身中,您需要更新arv
的每个引用以获得单个参考:
if(*arv == NULL) {
printf("foi");
*arv = (struct no *) calloc(1, sizeof(struct no));
(*arv)->info = x;
//... and the rest, just didn't want to finish it off
然后在main()
中传递结构的地址:
inserir_no(&a, valor);
另外两个注意事项:
free()
已分配的内存main()
下面使用它,这样就不需要了)答案 2 :(得分:0)
拨打inserir_no(&a, valor);
并将函数签名更改为inserir_no(struct no **arv , int x)
然后它会工作,因为传递地址而不是指针的值。
*arv
将是pointer to struct no
,因此请在每个地方使用,而不是仅使用arv