Ir para conteúdo
Fórum Script Brasil

Paulo Lottermann

Membros
  • Total de itens

    1
  • Registro em

  • Última visita

Tudo que Paulo Lottermann postou

  1. Olá boa noite Estou com um pequeno problema num trabalho para a faculdade sobre árvores em C. Na função "consulta", estou com um problema, quando mando consultar um elemento pra verificar se está presente ou não na árvore, ele dá a mesma msg, de item não encontrado, mesmo ele estando presente na árvore. Ficaria muito grato com alguma ajuda, Atenciosamente.... #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> int main(); void insere (struct no *&praiz, struct no *novo); void emordem (struct no *raiz); void preordem (struct no *raiz); void posordem (struct no *raiz); int pesquisa (struct no *aux1, int itemaux); void remove (struct no *&aux1); struct no { int item; struct no *esq, *dir; }; struct no *raiz, *aux1, *aux2; int main() { char c, op = '1', auxitem[3]; int achou; raiz = (struct no*) NULL; // inicializa a arvore vazia while (op != '0') { system("cls"); puts(" Operacoes em Arvores Binarias de Busca\n\n"); puts("1. Inserir um item novo na arvore"); puts("2. Consultar um item na arvore"); puts("3. Remover um item da arvore"); puts("4. Imprimir a arvore em pre-ordem"); puts("5. Imprimir a arvore em ordem"); puts("6. Imprimir a arvore em pos-ordem"); puts("0. Sair"); printf("Entre com sua opcao: "); op = getche(); switch(op) { case '1': // insere { aux1 = (struct no *) malloc(sizeof(struct no)); printf("\n\nEntre com o item a ser inserido: "); gets(auxitem); aux1->item = atoi(auxitem); aux1->esq = aux1->dir = (struct no*) NULL; if (raiz == (struct no *) NULL) raiz = aux1; else { aux2 = raiz; insere(aux2, aux1); } } break; case '2': // consulta { if (raiz == (struct no *) NULL) printf("\n\nImpossivel pesquisar. Arvore vazia !"); else { printf("\n\nEntre com o item a ser pesquisado: "); gets(auxitem); achou = pesquisa(raiz, (atoi(auxitem))); if (achou) puts("Não Achou !"); else puts ("Achou !"); } } break; case '3': // remove { if (raiz == (struct no *) NULL) printf("\n\nImpossivel remover. A arvore estah vazia !"); else { printf("\n\nEntre com o item a ser removido: "); gets(auxitem); achou = pesquisa(raiz, (atoi(auxitem))); if (achou) puts("Impossivel remover. O elemento não existe na arvore !"); else // acha o endereco a ser modificado e passa p/ a funcao remove { if (raiz->item == atoi(auxitem)) // remove o noh que estah remove(raiz); // ocupando a raiz da arvore else { aux1 = raiz; while((aux1->dir->item != atoi(auxitem)) && (aux1->esq->item != atoi(auxitem))) { if (atoi(auxitem) <= aux1->item) aux1 = aux1->esq; else aux1 = aux1->dir; } // while if (aux1->dir->item == atoi(auxitem)) remove(aux1->dir); else remove(aux1->esq); } // else if raiz->item == auxitem } // else if !achou } // else if raiz == NULL } // case '3' break; case '4': // imprime em pre ordem { printf("\n\nImprimindo os componentes em pre-ordem: "); preordem(raiz); } break; case '5': // imprime em ordem (central) { printf("\n\nImprimindo os componentes em ordem: "); emordem(raiz); } break; case '6': // imprime em pos ordem { printf("\n\nImprimindo os componentes em pos-ordem: "); posordem(raiz); } break; case '0': break; default : puts("\nOpcao invalida"); } /* switch */ puts("\nPressione <ENTER> para continuar"); while ((c = getchar()) != '\n'); } /* while */ } /* funcao main () */ void insere (struct no *&praiz, struct no *novo) { if (praiz == (struct no *) NULL) praiz = novo; else { if (novo->item <= praiz->item) insere(praiz->esq, novo); else insere(praiz->dir, novo); } } int pesquisa (struct no *aux1, int itemaux) { if (aux1 == (struct no *) NULL) // não achou return(0); if (aux1->item == itemaux) // achou return(1); if (itemaux <= aux1->item) pesquisa(aux1->esq, itemaux); else pesquisa(aux1->dir, itemaux); } /* funcao pesquisa */ void remove (struct no *&aux1) { struct no *temp; if (aux1->dir == (struct no *) NULL) { temp = aux1; aux1 = aux1->esq; free(temp); } else if (aux1->esq == (struct no *) NULL) { temp = aux1; aux1 = aux1->dir; free(temp); } else // ambas as subarvores do noh a ser removido estao ocupadas { temp = aux1->dir; while (temp->esq != (struct no *) NULL) // acha a posicao mais a temp = temp->esq; // esquerda possivel na // subarvore da direita temp->esq = aux1->esq; // liga esta posicao com a subarvore // esquerda do noh a ser removido temp = aux1; aux1 = aux1->dir; // faz a subarvore da direita assumir o lugar do // noh a ser removido free(temp); } } /* funcao remove */ void emordem (struct no *raiz) { if (raiz != (struct no *) NULL) { emordem(raiz->esq); printf("%d ", raiz->item); emordem(raiz->dir); } } void preordem (struct no *raiz) { if (raiz != (struct no *) NULL) { printf("%d ", raiz->item); preordem(raiz->esq); preordem(raiz->dir); } } void posordem (struct no *raiz) { if (raiz != (struct no *) NULL) { posordem(raiz->esq); posordem(raiz->dir); printf("%d ", raiz->item); } }Ps: O código está rodando no Dev C++.
×
×
  • Criar Novo...