(二叉树)代码不工作但是 returns 编译时没有错误

(Binary tree) Code doesn't work but returns no error when compiling

编译此代码时,编译器不会return任何警告或错误,但代码根本无法运行。

函数 inserirDado 应该递归地创建节点并在 node.valor 上存储值,应用我之前设置的条件。

void inserirDado(struct node **no, int numero)
{
     if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.

          * no = (struct node *) malloc(sizeof(struct node));
          (*no)->direita = NULL;
          (*no)->esquerda = NULL;
          (*no)->valor = numero;

     }else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
          if (numero < (*no)->valor) {
               inserirDado(&(*no)->esquerda, numero);
          }
          else
          {
               inserirDado(&(*no)->direita, numero);
          }
          
     }
}

emOrdem,函数调用自身直到它到达叶子,然后它应该打印存储在 node.valor 的值:

void emOrdem(struct node *no)
    {
         if(no != NULL)
         {
              emOrdem(no->esquerda);
              printf("%i", no->valor);
              emOrdem(no->direita);
    
         }
    }

完整代码为:

#include <stdio.h>
#include <stdlib.h>

struct node
{
     int valor;
     struct node *esquerda;
     struct node *direita;
};

void inserirDado(struct node **no, int numero);

void emOrdem(struct node *no);

int main(void) {

    struct node **arvore1;
    inserirDado(arvore1, 4);
    inserirDado(arvore1, 2);
    inserirDado(arvore1, 3);
    inserirDado(arvore1, 10);
    emOrdem(*arvore1);

}

//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.

void inserirDado(struct node **no, int numero)
{
     if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.

          * no = (struct node *) malloc(sizeof(struct node));
          (*no)->direita = NULL;
          (*no)->esquerda = NULL;
          (*no)->valor = numero;

     }else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
          if (numero < (*no)->valor) {
               inserirDado(&(*no)->esquerda, numero);
          }
          else
          {
               inserirDado(&(*no)->direita, numero);
          }
          
     }
}

void emOrdem(struct node *no)
{
     if(no != NULL)
     {
          emOrdem(no->esquerda);
          printf("%i", no->valor);
          emOrdem(no->direita);

     }
}

如果您使用 GCC 10 编译此代码,并使用开关 -W -Wextra -Wall(顺便说一句,这不全是警告),您将得到:

<source>: In function 'main':
<source>:18:5: warning: 'arvore1' is used uninitialized in this function [-Wuninitialized]
   18 |     inserirDado(arvore1, 4);
      |     ^~~~~~~~~~~~~~~~~~~~~~~

GodBolt

这向您展示了问题出在哪里:您正在尝试初始化 arvore1 的位置 指向 而不是初始化 .

另请阅读:

您必须分配缓冲区并将其分配给 arvore1,然后再将其传递给 inserirDado

int main(void) {

    struct node **arvore1 = malloc(sizeof(struct node*)); // add malloc()
    inserirDado(arvore1, 4);
    inserirDado(arvore1, 2);
    inserirDado(arvore1, 3);
    inserirDado(arvore1, 10);
    emOrdem(*arvore1);

}

另一种选择是将 arvore1 从“指向指针的指针”更改为“指针”, 并将指向它的指针传递给 inserirDado.

int main(void) {

    struct node *arvore1 = NULL;
    inserirDado(&arvore1, 4);
    inserirDado(&arvore1, 2);
    inserirDado(&arvore1, 3);
    inserirDado(&arvore1, 10);
    emOrdem(arvore1);

}

(1) 实际上你应该收到 SEG Fault 因为你还没有将 arovore1 初始化为 NULL。

(2) 这里要提的重点是,我们用双指针去掉了return值。而你在这里所做的有点自相矛盾。

--> 基本上我们将创建一个节点 (arvore1) 然后发送节点的地址 (&arvore1) 到 insertNode (inserirDado) 函数,并在其中更新相应的节点 地址到新创建的节点(temp)。 我在这里附上了工作代码。请参考此内容,如有任何疑问,您可以对其进行评论。

#include <stdio.h>
#include <stdlib.h>

struct node
{
     int valor;
     struct node *esquerda;
     struct node *direita;
};

void inserirDado(struct node **no, int numero);

void emOrdem(struct node *no);

int main(void) {

    struct node *arvore1 = NULL;
    inserirDado(&arvore1, 4);
    emOrdem(arvore1);

}

//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.

void inserirDado(struct node **no, int numero)
{
     if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.

          struct node *temp = (struct node *) malloc(sizeof(struct node));
          (temp)->direita = NULL;
          (temp)->esquerda = NULL;
          (temp)->valor = numero;
          *no = temp;

     }else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
          if (numero < (*no)->valor) {
               inserirDado(&(*no)->esquerda, numero);
          }
          else
          {
               inserirDado(&(*no)->direita, numero);
          }
          
     }
}

void emOrdem(struct node *no)
{
     if(no != NULL)
     {
          emOrdem(no->esquerda);
          printf("%d", no->valor);
          emOrdem(no->direita);

     }
}