Ir ao conteúdo
  • Cadastre-se

Arvore Binaria- Problema busca


Luã Faria
Ir à solução Resolvido por CiroboyBR,

Posts recomendados

Estou tendo problema na função busca(Falha de segmentação) ..

Código:

typedef struct a{	int dado;	struct a *esq, *dir;}no;//função de inserirvoid insere(no **novo, int dado){	if(!*novo)//Testa se o ponteiro *novo não tem endereço 	{		*novo= (no*)malloc(sizeof(no));// Aloca um nó, seu endereço é inserido no ponteiro *novo.		(*novo)->esq = NULL; 		(*novo)->dir = NULL;		(*novo)->dado = dado;	}	else if(dado > (*novo)->dado)		insere(&(*novo)->dir,dado);	else		insere(&(*novo)->esq,dado);}//outras funções...no *busca(no **raiz, int dado)//*busca retorna o endereço de um nó{	if(*raiz)	{		if((*raiz)->dado == dado)		{			no *aux = *raiz;			return aux;		}				if((*raiz)->dado > dado)			busca(&(*raiz)->esq,dado);		else			busca(&(*raiz)->dir,dado);	}	else		return NULL;}//mainvoid main(){	no *raiz = NULL, *aux;	int dado; char op;	while(1)	{		printf("\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");		printf("\n@                                                                @");		printf("\n@      1-Insere\t    2-Imprime\t3-Altura\t4-BuscarNo       @");		printf("\n@      5-Consultar\t 6-Maior\t7-Menor\t8-Remover                @");		printf("\n@      9-ConsultarPai                                       @");		printf("\n@                                                                @");		printf("\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nOP:");		scanf(" %c",&op);		system("clear");		switch(op)		{			case'1':printf("\nDigite o dado a ser inserido:");					scanf("%d",&dado);					insere(&raiz,dado);break;			case'2':imprime_ordem(raiz);break;			case'3':printf("\nA Altura é: %d",altura(raiz));break;			case'4':printf("\nDigite o dado do no a ser buscado: ");					scanf("%d",&dado);					aux = busca(&raiz,dado);					if(aux)						printf("No com dado %d, a esquerda %d e a direita %d",aux->dado,aux->esq->dado,aux->dir->dado);					else						printf("Nao existe");break;			case'5':printf("Digite o dado a ser consultado: ");					scanf("%d",&dado);					if(consulta_no(raiz,dado))						printf("O no foi encontrado");					else						printf("Nao foi possivel encontrar");			case'6':printf("\nO maior valor %d",maior(raiz));break;			case'7':printf("\nO menor valor %d",menor(raiz));break;			case'8':printf("Digite o dado que deseja remover: ");					scanf("%d",&dado);remove_no(&raiz,dado);break;			case'9':printf("Digite o no que deseja saber o pai: ");					scanf("%d",&dado); 					aux = pai(raiz,dado);					printf("\nO no pai %d, filho esq %d filho dir %d",aux->dado, (aux->esq)? aux->esq->dado : 0, (aux->dir)?aux->dir->dado : 0);					break;		}	}}
Link para o comentário
Compartilhar em outros sites

  • Solução

O case 4 vai imprimir os dados da esquerda e da direita também, se não tiver dados na esquerda ou direita, ele trava.

 

#include <stdio.h>#include <stdlib.h>typedef struct a {  int dado;  struct a *esq, *dir;} no;//função de inserirvoid insere(no **novo, int dado) {  if(!*novo) { //Testa se o ponteiro *novo não tem endereço    *novo= (no*)malloc(sizeof(no));// Aloca um nó, seu endereço é inserido no ponteiro *novo.    (*novo)->esq = NULL;    (*novo)->dir = NULL;    (*novo)->dado = dado;  } else if(dado > (*novo)->dado) {    printf("\nDireita");    insere(&(*novo)->dir,dado);  }  else if(dado < (*novo)->dado){    printf("\n esquerda");    insere(&(*novo)->esq,dado);  }}//outras funções...no *busca(no **raiz, int dado) { //*busca retorna o endereço de um nó  if(*raiz) {    if((*raiz)->dado == dado) {      no *aux = *raiz;      return aux;    }    if((*raiz)->dado > dado){      printf("\n%d | vou buscar na esquerda", (*raiz)->dado);      busca(&(*raiz)->esq,dado);      }    else {      printf("\n%d | vou buscar na direita", (*raiz)->dado);      busca(&(*raiz)->dir,dado);      }  } else{      printf("\nParei sem achar");      return NULL;    }}//mainvoid main() {  no *raiz = NULL, *aux;  int dado;  char op;  while(1) {    printf("\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");    printf("\n@                                                                @");    printf("\n@      1-Insere\t    2-Imprime\t3-Altura\t4-BuscarNo       @");    printf("\n@      5-Consultar\t 6-Maior\t7-Menor\t8-Remover                @");    printf("\n@      9-ConsultarPai                                       @");    printf("\n@                                                                @");    printf("\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nOP:");    scanf(" %c",&op);    system("cls");    switch(op) {    case'1':      printf("\nDigite o dado a ser inserido:");      scanf("%d",&dado);      insere(&raiz,dado);      break;    case'4':      printf("\nDigite o dado do no a ser buscado: ");      scanf("%d",&dado);      aux = busca(&raiz,dado);      if(aux){        printf("\nNo com dado %d, ",aux->dado);      }      else        printf("Nao existe");      break;    }  }}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!