Ir para conteúdo
Fórum Script Brasil
  • 0

Gerenciador Arvore Binária


Minduca

Pergunta

Olá a todos, após a tabela hash com lista encadeada, estou agora em arvore binária.

Fiz um código com menu e tudo mais, ele insere as chaves ok, mas quando vou listá-las

não aparece nada?? Gostaria que atentassem para a criação da arvore vazia e da chave RAIZ

no antes do Main e depois eu tenho a funçao insere que é a opção 1 e recebe o novo valor

e também a arvore raiz criada anteriormente, esta correto isso?

segue código:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

/*============================================================================*/
/*                 PROGRAMA PARA GERENCIAR DADOS NUMA ÁRVORE                  */
/*============================================================================*/ 

struct arv {
   char   chave; 
   struct arv *esq;
   struct arv *dir; 
};
typedef struct arv Arv; 

/* ----------------------------- Protótipos ----------------------------------*/

Arv *criar_v(void);
Arv *cria_raiz(char v, Arv *sae, Arv *sad); 
Arv *insere(char v, Arv *a);
void pesquisa_um_imprime(char v, Arv *a);
void pesquisa_todos_imprime(Arv *a);
int pesquisa_todos(Arv *a, int achou);
Arv *limpa_arv(Arv *a);
/* Arv *deleta(char c, Arv *a); */

/* --------------------------------- MAIN ------------------------------------*/

main(void)
{                               /* abre MAIN  */
  int cont, n, achou=0;
  char opcao, v;  

  Arv *raiz;
  Arv *a;
  Arv *sae, *sad;
  printf("\nEntre com a RAIZ da Arvore = "); 
  scanf("%s",&v);  
  a = criar_v();  /* ------> AQUI ESTA CERTO O CRIAR A ARVORE VAZIA??? */   
  raiz = cria_raiz(v,a,a); /* ----> crio a arvore com o valor RAIZ */
/* -------------------------------- INÍCIO -----------------------------------*/

  do
  {                            /* abre do while */
    system("cls"); 
    printf("\n\n GERENCIAMENTO DE ÁRVORE \n\n");

    printf("1. Inserir\n");
    printf("2. Deletar\n");
    printf("3. Pesquisar Um\n");
    printf("4. Pesquisa Todos\n");
    printf("5. Limpa Arv\n");
    printf("0. Sair\n");
    printf("\nEntre com sua opcao: ");
    scanf("%s", &opcao);
    switch(toupper(opcao))
    {                            /* abre switch */
      case '1':
      {        
        printf("\nEntre com a chave = "); 
        scanf("%s",&v);  
                 
        a = insere(v,raiz);  /* --> AQUI RECEBO A ARVORE INICIALIZADA com  */
                         /* a raiz para entrar com o 2º valor, ESTA CORRETO?? */                     
            
      }
      
      break;

      case '2':
      { 
        
        achou = pesquisa_todos(raiz,achou);  
        
        if (achou == 0)
            printf("\n\n Arvore não contem Registros!");   
        else  {       
            printf("\nEntre com o valor da chave a ser deletada = "); 
            scanf("%d",&v);}
            
            /* i = deleta(v,a);} */         
            
      }
      getch();
      break;

      case '3':
      {
        
        achou = pesquisa_todos(a,achou);  
                
        if (achou == 0)
            printf("\n\n Arvore não contem Registros!");  
        else {   
              printf("\nEntre com o valor da chave a ser pesquisada = "); 
              scanf("%d",&v);              
              pesquisa_um_imprime(v,a);
             }                     
        
      }
      getch();
      break;

      case '4':
      {  
        
        
        achou = pesquisa_todos(a,achou);             
           
                
       if (achou == 0)
           printf("\n\n Arvore não contem Registros!");
       else       
           pesquisa_todos_imprime(a);             
               
                                
               
      getch();
      break;      
      }
      
      case '5':
      { 
                    
        achou = pesquisa_todos(a,achou);  
                
        if (achou == 0)
            printf("\n\n Arvore não contem Registros!");  
        else 
           {   
            limpa_arv(a);        
            printf("\n Arvore Limpa!");                  
           }
                      
      getch();
      break;      
      } 
        
         case '0':
      {
        return(0); 
      }
      default : printf("\nOpcao invalida"); getch();
    }                         /*  fecha switch   */
  } while(opcao != '0');      /* fecha do while  */
getch(); 
}                             /*   fecha MAIN    */ 

/* ---------------------------------------------------------------------------*/
/*                                 FUNÇÕES                                    */
/* ---------------------------------------------------------------------------*/

/* ------------------------------função insere--------------------------------*/
                         
Arv *insere(char v, Arv *a)
{ 
  Arv *p = a; 
              
  if(p != NULL)         /*   faz uma busca na arvore     */
      {
         if (p->chave == v)
             {
              printf("\n A chave %d já existe",v);
              return a;}
          else { 
              if(p->chave < v)
                 insere(v,p->dir);
              else
                 insere(v,p->esq); 
              }                        
      }
   
  if (p == NULL)   /* chave não encontrada ---> CRIANDO o NÓ -----------------*/
     {               
        
        p = (Arv *)malloc(sizeof(Arv));             
        p->chave = v;
        p->esq = NULL;
        p->dir = NULL;
                    
        a = p;

        return a;                  
     }     
}    

/* ----------------------função pesquisa todos recursiva ---------------------*/

int pesquisa_todos(Arv *a, int achou)
{      
   Arv *p = a;
   while(p != NULL)
         {
          achou = 1;           
         }
      
   return achou;            
}

/* --------------------------função pesquisa um imprime recursiva-------------*/

void pesquisa_um_imprime(char v, Arv *a)
{ 
       
       Arv *p = a;
              
       while(p != NULL)
          { 
             if (p->chave == v) {  
                 printf("\n Chave encontrada = %d",p->chave); 
                 break;
               }
               else 
                 if(p->chave < v)
                    pesquisa_um_imprime(v,p->dir);
                 else
                    pesquisa_um_imprime(v,p->esq); 
          } 
       
       if (p == NULL)
           printf("\n A Chave = %d não existe na Tabela ",v);
             
}
/* ------------------função pesquisa todos imprime recursiva -----------------*/

void pesquisa_todos_imprime(Arv *a)
{      
       Arv *p = a;
                                  
       if(p != NULL)
         {
          printf("\t chave = %s",p->chave); 
          pesquisa_todos_imprime(p->esq);
          pesquisa_todos_imprime(p->dir);
         }
      
                 
}
/* -------------------------------função criar--------------------------------*/
Arv *criar_v(void)
  { return NULL; 

  }
/* -------------------------------função deleta-------------------------------*/
                         
/*                    A SER IMPLEMENTADA - estudarei exemplos da NET.         */
    
/* -------------------------------função limpa arvore ------------------------*/

Arv *limpa_arv(Arv *a)
{
  
  if (a != NULL) 
    { 
      limpa_arv(a->esq);
      limpa_arv(a->dir);                
      free(a);   
    }                       
  
  return NULL;  
}

/* -------------------------------função limpa cria raiz ---------------------*/

Arv *cria_raiz(char v, Arv *sae, Arv *sad)
{
  
   Arv *raiz = (Arv *)malloc(sizeof(Arv));             
        raiz->chave = v;
        raiz->esq = sae;
        raiz->dir = sad;
                    
   return raiz;   
  
}

/* --------------------------------FIM FUNÇÕES--------------------------------*/

valeu

Minduca

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...