Ir para conteúdo
natalia_oliveira

Erro de FALHA DE SEGMENTAÇÃO

Recommended Posts

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

Usou o depurador p/ ver se não está tentando acessar o membro de um elemento NULL?

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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
Visitante
Este tópico está impedido de receber novos posts.

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.