二进制树中的插入错误或指针错误

时间:2012-11-26 16:23:14

标签: c pointers binary-tree

当我尝试在二叉树中添加一个数字时,会出现着名的分段错误

我猜错误是函数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;
}

3 个答案:

答案 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);

另外两个注意事项:

  1. 您现在有内存泄漏,在离开前需要free()已分配的内存
  2. 如果函数在使用之前声明,则不需要额外的原型。 (在这种情况下,你在顶部声明它,然后在main()下面使用它,这样就不需要了)

答案 2 :(得分:0)

拨打inserir_no(&a, valor);

并将函数签名更改为inserir_no(struct no **arv , int x)

然后它会工作,因为传递地址而不是指针的值。

*arv将是pointer to struct no,因此请在每个地方使用,而不是仅使用arv