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--------------------------------*/
Pergunta
Minduca
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:
valeu
Minduca
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.