簡體   English   中英

(二叉樹)代碼不起作用但編譯時不返回錯誤

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

編譯此代碼時,編譯器不會返回任何警告或錯誤,但代碼根本不起作用。

function 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);
      |     ^~~~~~~~~~~~~~~~~~~~~~~

神螺栓

這向您顯示了問題所在:您正在嘗試初始化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 故障,因為您尚未將 arovore1 初始化為 NULL。

(2) 這里要提到的重要一點是,我們使用雙指針來擺脫返回值。 你在這里所做的有點矛盾。

--> 基本上我們將創建一個節點 (arvore1),然后將節點 (&arvore1) 的地址發送到 insertNode (inserirDado) function,在其中,我們將該地址中的相應節點更新為新創建的節點 (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);

     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM