Jump to content
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);
    }
}

 

Share this post


Link to post
Share on other sites

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

  • +1 1

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.