natalia_oliveira 0 Denunciar post Postado Junho 5, 2017 Boa noite, Neste programa, você deve entrar com um inteiro C (C ≤ 1000), indicando o número de casos de teste que virão a seguir. Cada caso de teste é composto por 2 linhas. A primeira linha contém um inteiro N (1 ≤ N ≤ 500) que indica a quantidade de números que deve compor cada árvore e a segunda linha contém N inteiros distintos e não negativos, separados por um espaço em branco. Cada linha de entrada produz 3 linhas de saída. Após construir a árvore binária de busca com os elementos de entrada, deve-se imprimir a mensagem "Case n:", onde n indica o número do caso de teste e faz os três percursos da árvore: prefixo, infixo e posfixo, apresentando cada um deles em uma linha. Quando executo ele dá o ero de falha de segmentação. Será que alguém pode me ajudar a resolver esse problema ? O meu código é: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ int node; struct tree *left; struct tree *right; }tree; tree *raiz; tree * visita_raiz(tree *ra, tree *r, int valor); void insere(int valor); void preordem(); void emordem(); void posordem(); int main(){ int c, n, i, j, a, raiz; scanf("%d",&c); for(i=0; i<c; i++){ scanf("%d", &n); for(j=0; j<n; j++){ scanf("%d", &a); } printf("Case %d\n", i+1 ); printf("Pre.:");preordem(raiz); puts(""); printf("In..:");emordem(raiz); puts(""); printf("Post:");posordem(raiz); puts("\n"); raiz = NULL; } return 0; } tree * visita_raiz(tree *ra, tree *r, int valor){ r = (tree *) malloc(sizeof(tree) *1000); if(r == NULL){ r->left = NULL; r->right = NULL; r->node = valor; if(ra == NULL){ return r; } if(valor < ra->node){ ra->left = r; } else{ ra->right = r; } return r; } if(valor < r->node){ visita_raiz(r,r->left,valor); } else{ visita_raiz(r,r->right,valor); } } void insere(int valor){ if(raiz == NULL){ raiz = visita_raiz(raiz,raiz,valor); }else{ visita_raiz(raiz,raiz,valor); } } void preordem(tree *pNo){ if (pNo != NULL){ printf(" %d", pNo->node); preordem(pNo->left); preordem(pNo->right); } } void emordem(tree *pNo){ if (pNo != NULL){ emordem(pNo->left); printf(" %d", pNo->node); emordem(pNo->right); } } void posordem(tree *pNo){ if (pNo != NULL){ posordem(pNo->left); posordem(pNo->right); printf(" %d", pNo->node); } } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Junho 5, 2017 Usou o depurador p/ ver se não está tentando acessar o membro de um elemento NULL? 1 Compartilhar este post Link para o post Compartilhar em outros sites
natalia_oliveira 0 Denunciar post Postado Junho 6, 2017 Tentei e não é isso. Compartilhar este post Link para o post Compartilhar em outros sites
natalia_oliveira 0 Denunciar post Postado Junho 7, 2017 Alguma outra sugestão ? Compartilhar este post Link para o post Compartilhar em outros sites
Wilkyn Fernandes Taborda 0 Denunciar post Postado Maio 28, 2020 Na função principal quando você chama as funções preordem, emordem e posordem você passa através de parâmetros valores diferentes do especificado na lista de parâmetros dessas funções. Elas estão esperando receber valores de um tipo e recebem de outro. O valor inteiro da variável raiz é passado no lugar de um ponteiro de tree. Passar valores de tipo diferente do especificado e esperado pelas funções em C mesmo sendo aceito pelo compilador e criado o programa faz com que ele trave durante sua execução. Compartilhar este post Link para o post Compartilhar em outros sites