Ir ao conteúdo

Pesquisa em Árvore Binária


abc_do_pc

Posts recomendados

Postado

Ai pessoal , terminei de fazer uma agenda com árvore binaria.

Nessa árvore contem Inserção, Remoção e Pesquisa.

Quando insiro um nome ela faz a pesquisa normal, mas quando insiro mais de

um nome, e faço a busca do segundo numero digitado, a pesquisa retorna que o contato não existe.

SE alguem poder me ajudar...:confused:

O código está abaixo:

#include <iostream>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

typedef struct Contatos {

char nome[100];

char telefone[10];

}Contatos;

typedef struct Celula *Apontador;

typedef struct Celula

{

Contatos Contato;

Apontador Dir;

Apontador Esq;

}Celula;

Apontador Raiz;

//******** Inicializando *******

void inicializar(Apontador *Raiz ){

*Raiz = NULL;

}

//******************************

//*********Inserindo Contatos*****************

void inserir(Contatos reg, Apontador *p)

{

if(*p==NULL)

{

*p = (Apontador) malloc(sizeof(Celula));

(*p)->Contato=reg;

(*p)->Dir=NULL;

(*p)->Esq=NULL;

}

else if(strcmp((*p)->Contato.nome, reg.nome) <0)

{

inserir(reg,&(*p)->Esq);

}else{

inserir(reg, &(*p)->Dir);

}

}

//******************FIM INSERE*************************

//************Pesquisa na Arvore********************

void pesquisa(Contatos *reg, Apontador *p)

{

if(*p==NULL){

printf("Erro, contato não exite\n");

return;}

else if(strcmp(reg->nome,(*p)->Contato.nome)<0)

{

pesquisa(reg,&(*p)->Esq);

return;

}

else if(strcmp(reg->nome,(*p)->Contato.nome)>0)

{

pesquisa(reg,&(*p)->Dir);

}

else *reg=(*p)->Contato;

printf("Contato:%s\n",(*p)->Contato.nome);

printf("Telefone:%s\n",(*p)->Contato.telefone);

system("PAUSE");

return;

}

//***************FIM PESQUISA************************

/*===================================================

RETIRANDO CONTATO DA ARVORE

===================================================

*/

void Antecessor(Apontador q,Apontador *r){

if((*r)->Dir!=NULL){

Antecessor(q,&(*r)->Dir);

return;}

q->Contato=(*r)->Contato;

q=*r;

*r=(*r)->Esq;

free(q);

}

void Retira(Contatos reg,Apontador *p){

Apontador Aux;

if(*p==NULL){

printf("Erro: Registro não esta na arvore\n");}

if(strcmp(reg.nome,(*p)->Contato.nome)<0){

Retira(reg,&(*p)->Esq);

return;}

if(strcmp(reg.nome,(*p)->Contato.nome)>0){

Retira(reg,&(*p)->Dir);}

if ((*p)->Dir==NULL){

Aux=*p;

*p=(*p)->Esq;

free(Aux);

return;}

if ((*p)->Esq!=NULL){

Antecessor(*p,&(*p)->Esq);

return;}

Aux=*p;

*p=(*p)->Dir;

free(Aux);

}

//*******************************

int main(){

int escolha;

FILE *arq;

Contatos Cont;

Celula *Raiz;

inicializar(&Raiz);

arq = fopen("Arvore.txt","w+");

do{

printf("______Digite (1) para ______INSERIR CONTATO\n");

printf("______Digite (2) para ______PESQUISAR CONTATO\n");

printf("______Digite (3) para ______RETIRAR CONTATO\n");

printf("______Digite (4) para ______SAIR\n\n\n");

scanf("%d",&escolha);

if(escolha<1||escolha>4)

{

printf("Opcao invalida\n");

}

if(escolha==1)

{ printf("Digite o nome a ser inserido\n");

scanf("%s",&Cont.nome);

printf("Digite o telefone a ser inserido\n");

scanf("%s",&Cont.telefone);

inserir(Cont,&Raiz);

fprintf(arq, "%s %s\n",Cont.nome, Cont.telefone);

}

if(escolha==2)

{

printf("Digite o nome a ser pesquisado\n");

scanf("%s",Cont.nome);

pesquisa(&Cont,&Raiz);

}

if(escolha==3)

{

printf("Digite o nome a ser removido\n");

scanf("%s",Cont.nome);

Retira(Cont,&Raiz);

printf("Contato:%s removido\n",Cont.nome);

}

}while(escolha!=4);

system("pause");

return (0);

}

Postado

Ora tenta alterar isto:

if(strcmp(reg->nome,(*p)->Contato.nome)>0)

e o outro

if(strcmp(reg->nome,(*p)->Contato.nome)<0)

Ou seja, eu troquei os sinais. Vê se funciona.

A mesma lógica será para o remover, já se estás a duplicar código. Talvez fosse melhor ter uma função que devolva a posição e usar essa função na procura e na eliminação.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!