Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Problema com Árvore Binária

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Problema com Árvore Binária

    Olá pessoal,

    Hoje eu levantei com o pé direito e resolvi aprender uma nova linguagem, migrando do JAVA para o C.

    Como já sei lógica de programação, resolvi pular a parte dos ifs, elses, int e etc para a parte que, particulamente, acho mais difícil na linguagem: os ponteirinhos :P

    Então resolvi começar pela árvore binaria, que é uma estrutura simples de se fazer, ou ao menos era pra ser =/

    Acontece que, ao inserir mais de um elemento que tende ao lado de um que ja foi inserido, o programa trava e não consegui encontrar o por que, ja que existem inúmeras hipóteses para o erro 0xFF no code blocks

    segue abaixo o código:

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #define null NULL //preguica de segura shift ;)
    
    //***************************************
    //     Definicao de estrutura do no
    //***************************************
    typedef struct NODE{
        int key;
        struct NODE *esq;
        struct NODE *dir;
    }No;
    
    //criar novo no
    No *newNo(int key){
        //reserve memoria para o novo no
        No *tmp = malloc(sizeof(tmp));
        //define os dados do novo no
        tmp->key = key;
        tmp->esq = null;
        tmp->dir = null;
        //retorna a posicao de memoria obtida
        return tmp;
    }
    
    //**************************************
    //      DECLARACAO DE VARIAVEIS
    //**************************************
    No *raiz; //raiz do no
    
    //**************************************
    //         METODOS E FUNCOES
    //**************************************
    
    //iniciar arvore
    void start(){
        raiz = null;
    }
    
    /**
        Inserir elemento na arvore
        @param no Ponteiro atual
        @param ins No a ser inserido
        @return No inserido
    */
    No *inserir(No *no, No *ins){
        //se elemento nulo, insere
        if(no == null){
            no = ins;
        //se a chave do a ser inserido menor que chave de no atual, anda pra esquerda
        }else if(ins->key < no->key){
            no->esq = inserir(no->esq, ins);
        //senao anda pra direita
        }else{
            no->dir = inserir(no->dir, ins);
        }
        return no;
    }//fim de inserir
    
    /**
        Construir novo no e chamar a funcao a ser inserida
        @param Chave do novo no
    */
    void inserir0(int key){
        No *toInsert = newNo(key);
        raiz = inserir(raiz, toInsert);
    }//fim de inserir
    
    /**
        Mostrar arvore
        @param no No incial da arvore
    */
    void mostrar(No *no){
        if (no != null){
            mostrar(no->esq);
            printf("%d\n", no->key);
            mostrar(no->dir);
        }
    }
    
    /**
        Realizar a leitura de um inteiro
    */
    int readInt(){
        int resp = -1;
        scanf("%d",&resp);
        fflush(stdin);
        return resp;
    }
    
    int main(){
        SetConsoleTitleA("Arvore Binaria");
        int op;
        int value;
        printf("*************** Arvore Binaria em C ***************\n\n");
        printf("TAREFAS:\n\n-1: Encerrar execução\n1: Inserir Elemento\n2: Mostrar Arvore\n");
        printf("Opcao: ");
        op = readInt();
        while (op != -1){
            switch (op){
                case 1:
                    printf("Valor a ser inserido: ");
                    value = readInt();
                    inserir0(value);
                    printf("Executei insercao");
                    break;
                case 2:
                    mostrar(raiz);
                    break;
                default:
                    printf("ERRO: Opcao invalida!\n");
            }
            printf("TAREFAS:\n\n-1: Encerrar execução\n1: Inserir Elemento\n2: Mostrar Arvore\n");
            printf("Opcao: ");
            op = readInt();
        }
        printf("Programa encerrado!");
        return 0;
    }
    Alguem ai sabe o que está acontecendo de errado?
    "The quieter you become, the more you are able to hear"
    Similar Threads

  • Font Size
    #2
    Não sei na árvore, mas com listas encadeadas, eu fazia verificações: se a lista é vazia na hora de inserir, se a lista era unitária na hora de remover, se for o primeiro, se for o último nó.

    Comment


    • Font Size
      #3
      Compilei com GCC no Ubuntu e está rodando normal

      Fiz inserções várias vezes do mesmo lado e nenhum erro foi retornado. Vc ta usando o GCC como compilador padrão no code blocks?
      "Não subestime os fracos pois eles não agem com a força e sim com a mente."

      Comment


      • Font Size
        #4
        Postado Originalmente por Radicalzinho Ver Post
        Compilei com GCC no Ubuntu e está rodando normal

        Fiz inserções várias vezes do mesmo lado e nenhum erro foi retornado. Vc ta usando o GCC como compilador padrão no code blocks?
        Desculpe a demora para responder, estou um pouco apertado na faculdade (Calculo, Arquitetura de computadores...). Mas voltando a questão, acho que uso a GNU GCC mesmo. Quando baixei o C::B pro windows baixei o "codeblocks-13.12mingw-setup-TDM-GCC-481.exe".

        Engraçado, ainda não testei no linux, mas se funciona no linux deveria funcionar no windows, não?

        Estava olhando com um colega meu, ele disse que talvez possa ser erro de fragmentação, mas nem sei o que é isso
        "The quieter you become, the more you are able to hear"

        Comment


        • Font Size
          #5
          ...

          Posso ajudar em mais dúvidas, me manda MP com seu skype!

          Comment


          • Font Size
            #6
            Postado Originalmente por D4rkS0ul Ver Post
            Desculpe a demora para responder, estou um pouco apertado na faculdade (Calculo, Arquitetura de computadores...). Mas voltando a questão, acho que uso a GNU GCC mesmo. Quando baixei o C::B pro windows baixei o "codeblocks-13.12mingw-setup-TDM-GCC-481.exe".

            Engraçado, ainda não testei no linux, mas se funciona no linux deveria funcionar no windows, não?

            Estava olhando com um colega meu, ele disse que talvez possa ser erro de fragmentação, mas nem sei o que é isso
            Em teoria sim. A unica coisa que fiz em seu código foi, retirar o uso da windows.h.
            "Não subestime os fracos pois eles não agem com a força e sim com a mente."

            Comment

            X
            Working...
            X