Ir ao conteúdo
  • Cadastre-se

Ajuda com Árvore binária - impressões bizarras


Gabrielbuosi
Ir à solução Resolvido por dontpanic,

Posts recomendados

Olá a todos! Estou com um problema bem estranho no código, meu professor tentou me ajudar e modificou meu código fazendo o valor do Nó auxiliar ser o retorno do método e esse retorno sendo atribuído à raíz da árvore, antes eu tinha feito de outra forma, atribuindo normalmente no método de inserção...

O código parece perfeito, mas estão surgindo erros meio bizarros nas impressões de pRaiz->palavra / pRaiz->pDir->palavra / pRaiz->pEsq->palavra, ora resultados <null>, ora resultados em branco e até mesmo caractéres estranhos

 

Segue o código:

#include <stdio.h>#include <stdlib.h>#include <string.h>  typedef struct No{char palavra[];struct No *pEsq, *pDir; }TNo;     TNo *pRaiz; TNo* Insercao(TNo *pRaiz, char novaPalavra[]); int main(void){ char exemplo1[] = "aaabbb";char exemplo2[] = "aaaaaa";char exemplo3[] = "aaaccc"; pRaiz = Insercao(pRaiz, exemplo1);pRaiz = Insercao(pRaiz, exemplo2);pRaiz = Insercao(pRaiz, exemplo3); printf("Palavra em pRaiz: %s\n", pRaiz->palavra);printf("Palavra em pRaiz->pDir: %s\n", pRaiz->pDir->palavra);printf("Palavra em pRaiz->pEsq: %s\n", pRaiz->pEsq->palavra);  } TNo* Insercao(TNo *pRaiz, char novaPalavra[]){ if(pRaiz == NULL){printf("Entrou no IF\n");  TNo *novoNo = (TNo *)malloc(sizeof(TNo));strcpy(novoNo->palavra, novaPalavra);         printf("novoNo->palavra dentro do IF: %s\n", novoNo->palavra);                novoNo->pDir = NULL;        novoNo->pEsq = NULL;                printf("novoNo->palavra dentro do if: %s\n", novoNo->palavra);        return novoNo;    }else{   if (strcmp(pRaiz->palavra, novaPalavra) < 0)   {   printf("entrou no ELSE1\n");      pRaiz->pEsq = Insercao(pRaiz->pEsq, novaPalavra);   return pRaiz;   }else{printf("entrou no ELSE2\n");     pRaiz->pDir = Insercao(pRaiz->pDir, novaPalavra); return pRaiz;}}}

Output:

Entrou no IFnovoNo->palavra dentro do IF: aaabbbnovoNo->palavra dentro do IF apos attr.:entrou no ELSE1Entrou no IFnovoNo->palavra dentro do IF: aaaaaanovoNo->palavra dentro do IF apos attr.:entrou no ELSE2Entrou no IFnovoNo->palavra dentro do IF: aaacccnovoNo->palavra dentro do IF apos attr.:8alavra em pRaiz: ÞPalavra em pRaiz->pDir:Palavra em pRaiz->pEsq:

Como podem ver, coloquei algumas impressões para ter uma ideia do que estava acontecendo. O método de inserção é executado 3x com 3 strings exemplo.

Espero que alguém me ajude... já tentei várias coisas e não consigo prosseguir.

Link para o comentário
Compartilhar em outros sites

  • Solução

Mudei algumas coisas na definição das strings e rodou certo aqui:

...typedef struct No{    char palavra[20];    struct No *pEsq, *pDir;}TNo;TNo *pRaiz = NULL;TNo* Insercao(TNo *pRaiz, char* novaPalavra);int main(){    char exemplo1[20] = "aaabbb";    char exemplo2[20] = "aaaaaa";    char exemplo3[20] = "aaaccc";    ...    return 0;}TNo* Insercao(TNo *pRaiz, char* novaPalavra){    ...}

Dependendo do compilador, string[10], string[] e *string, não resolvem pro mesmo tipo de variável e podem causar esses erros exotéricos.

Como você tá lidando com strings fixas, é melhor seguir o mesmo padrão na hora de declarar e acessar elas.

 

Além disso você tá esquecendo de liberar a memória daqueles mallocs no final do programa.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O código aqui funcionou corretamente.

Utilizei as seguintes entradas:

    char exemplo1[] = "aaaxxx";    char exemplo2[] = "aaaaaa";    char exemplo3[] = "aaabbb";
Para imprimir:

    printf("Palavra em pRaiz: %s\n", pRaiz->palavra);    printf("Palavra em pRaiz->pDir: %s\n", pRaiz->pDir->palavra);    printf("Palavra em pRaiz->pDir->pDir: %s\n", pRaiz->pDir->pDir->palavra);    printf("Palavra em pRaiz->pDir->pEsq: %s\n", pRaiz->pDir->pEsq->palavra);    printf("Palavra em pRaiz->pEsq: %s\n", pRaiz->pEsq->palavra);
Saída:

Entrou no IFnovoNo->palavra dentro do IF: aaaxxxnovoNo->palavra dentro do if: aaaxxxentrou no ELSE2Entrou no IFnovoNo->palavra dentro do IF: aaaaaanovoNo->palavra dentro do if: aaaaaaentrou no ELSE2entrou no ELSE1Entrou no IFnovoNo->palavra dentro do IF: aaabbbnovoNo->palavra dentro do if: aaabbbPalavra em pRaiz: aaaxxxPalavra em pRaiz->pDir: aaaaaaPalavra em pRaiz->pDir->pDir: (null)Palavra em pRaiz->pDir->pEsq: aaabbbPalavra em pRaiz->pEsq: (null)Process returned 0 (0x0)   execution time : 0.501 sPress any key to continue.
PS: Vale lembrar que você estava imprimindo apenas o primeiro nível abaixo da raíz, portanto, se os valores de entrada fossem inseridos para um mesmo lado da raíz, a sua impressão na tela não mostraria o conteúdo do segundo nível.

PS 2: Verdade o que o amigo @dontpanic comentou. Alterei também a struct (coloquei valor 100 para o array palavra) e coloquei também valor 100 para a declaração da função.

TNo* Insercao(TNo *pRaiz, char novaPalavra[100])
  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...