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:
#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
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.