Ir ao conteúdo
  • Cadastre-se

Dúvida em Lista Enc - Mover menor elemento para o início


LauraStudent

Posts recomendados

Ei pessoal!

Estou tentando fazer um programa em c++ que identifica o menor elemento inserido numa lista, para depois movê-lo ao início da lista.

Está dando erro na parte de identificar o menor elemento. Tentei várias vezes e não consegui. Será que alguém poderia ajudar? O problema está na última função, coloquei de outra cor. Desenvolvi no dev c++.

Segue código com as funções de adição, remoção, alteração, etc: 

 

 

#include <cstdio>#include <iostream>using namespace std;typedef struct Tipo_No{     float dado;     struct Tipo_No *prox;}TNo;typedef struct Tipo_ListaEnc{     TNo *inicio;     TNo *fim;     int tam;}TListaEnc;//protótipos das funçõesvoid menu();void criaLista(TListaEnc *lista);int vaziaLista(TListaEnc *lista);int cheiaLista(TNo *novo);void InserirNaLista(TListaEnc *lista);void RetirarDaLista(TListaEnc *lista);TNo* consultaNoAntLista(TListaEnc *lista, int Posicao);TNo* consultaNoLista(TListaEnc *lista, int Posicao);void alterarLista(TListaEnc *lista);void exibeLista(TListaEnc *lista);void esvaziaLista(TListaEnc *lista);void pesquisaElemento(TListaEnc *lista);void MoveMenor(TListaEnc *lista);int main(){     TListaEnc lista;     int opcao;          criaLista(&lista);     do{           menu();                      cout << endl << "Informe o numero da opcao que deseja: ";           cin >> opcao;                      switch(opcao)               {                case 1: {                         InserirNaLista(&lista);                         system("PAUSE");                         system("CLS");                         }                         break;                 case 2: {                         RetirarDaLista(&lista);                         system("PAUSE");                         system("CLS");                         }                         break;                case 3: {                         alterarLista(&lista);                         system("PAUSE");                         system("CLS");                         }                         break;                 case 4: {                         exibeLista(&lista);                         system("PAUSE");                         system("CLS");                         }                         break;                  case 5: {                         esvaziaLista(&lista);                         system("PAUSE");                         system("CLS");                         }                         break;                  case 6: {                         pesquisaElemento(&lista);                         system("PAUSE");                         system("CLS");                         }                         break;                  case 7: {                         MoveMenor(&lista);                         system("PAUSE");                         system("cls");                        }                      case 8: {                         cout << endl << "Programa finalizado! " << endl << endl;                        }                        break;                default:{                         cout << endl << "Opcao invalida! Usuario sera redirecionado ao menu." << endl << endl;                         system("PAUSE");                         system("CLS");                         }                }      }while(opcao != 8);system("PAUSE");return 0;}//funções do programa//menuvoid menu(){          cout << "========================= MENU LISTA GERAL ENC ==========================" << endl;          cout << endl << "1 - Adicionar elemento" << endl;     cout << "2 - Remover elemento" << endl;     cout << "3 - Alterar elemento da lista" << endl;     cout << "4 - Exibir lista" << endl;     cout << "5 - Limpar lista" << endl;     cout << "6 - Pesquisar determinado elemento na lista" << endl;     cout << "7 - Mover menor elemento para inicio da lista" << endl;     cout << "8 - Sair" << endl;}//criar lista enc vaziavoid criaLista(TListaEnc *lista){     lista->fim = lista->inicio = NULL;     lista->tam = 0;}//verificar se a lista enc está vaziaint vaziaLista(TListaEnc *lista){    return (lista->inicio == NULL && lista->fim == NULL);}//verificar se a lista enc está cheiaint cheiaLista(TNo *novo){    if(novo == NULL){         return 1;         }else{             return 0;    }}//inserir na listavoid InserirNaLista(TListaEnc *lista){     TNo* novo;     novo = (TNo *) malloc(sizeof(TNo));          if(cheiaLista(novo)){          cout << "Alocacao Maxima atingida" << endl << "Lista cheia!" << endl << endl;          system("PAUSE");          exit(1);          }else{                novo->prox = NULL;                cout << endl << " ======================== Inserir Item ======================== " << endl;                if(vaziaLista(lista))                {                cout << endl << endl << "Lista vazia, digite um numero: ";                cin >> novo->dado;                // Se a lista estiver vazia, o novo no será o primeiro da lista                lista->inicio = novo;                lista->fim = novo;                                }else{                                            int i, Posicao;                      TNo *Paux, *Aux1, *Aux2;                      exibeLista(lista);                      cout << endl << endl << "Em qual posicao voce deseja inserir?" << endl;                                            // gera lista de posições possiveis                      cout << endl << "posições disponiveis: " << endl;                      for(i = 0; i <= lista->tam; i++)                            cout << i << " ";                            cout << endl << endl;                            cin >> Posicao;                                                        while(Posicao < 0 || Posicao > (lista->tam)){                                  cout << endl << "Erro: Posicao nao existe!" << endl;                                  cout << endl << "Escolha uma das posições abaixo: " << endl;                                        for(i = 0; i <= lista->tam; i++)                                              cout << i << " ";                                              cout << endl << endl;                                              cin >> Posicao;                            }                                                        // O item a ser inserido e' no seguinte ao apontado por Aux.                            Paux = consultaNoAntLista(lista, Posicao);                            cout << endl << "Digite um numero: ";                            cin >> novo->dado;                            if(Posicao != 0)                            {                            // inserindo no' no meio e final da lista                            Aux1 = Paux->prox;                            Paux->prox = novo;                            novo->prox = Aux1;                                       if(Aux1 == NULL){                                             (lista->fim)->prox = novo;                                             lista->fim = novo;                                       }                            }else{                                  Aux1 = lista->inicio;                                  lista->inicio = novo;                                  (lista->inicio)->prox = Aux1;                            }                            }                            }                            (lista->tam)++;                            cout << endl << "Dado inserido com sucesso!" << endl << endl;                            system("PAUSE");}//retirar da listavoid RetirarDaLista(TListaEnc *lista){     if(vaziaLista(lista))          cout << endl << "Lista vazia!" << endl << endl;                   else{          int Posicao;                    exibeLista(lista);          cout << endl << endl << "Qual registro voce deseja excluir? Digite a posicao: ";          cin >> Posicao;          if(Posicao < 0 || Posicao > (lista->tam - 1)){          cout << endl << "Erro: Posicao nao existe!" << endl << endl;          system("PAUSE");          }          else{               TNo *P, *Aux;               // O item a ser retirado e o seguinte ao apontado por P.                P = consultaNoAntLista(lista, Posicao);                // removendo o no do meio e final da lista                if(Posicao !=0){ // verifica se o no e o primeiro da lista                     Aux = P->prox;                     cout << endl << endl << "O item a seguir foi removido da lista:" << Aux->dado << endl;                     P->prox = Aux->prox;                                          if(Aux->prox == NULL)                                          lista->fim = P;                                          }else{ // removendo o primeiro no da lista                            Aux = P;                            lista->inicio = lista->inicio->prox;                            P->prox = Aux->prox;                                                        if(P->prox == NULL) //verifica se o no e o unico da lista                                lista->fim = P->prox;                                cout << endl << "O item a seguir foi removido da lista: " << Aux->dado << endl;                     }                     (lista->tam)--;                     free(Aux);                }          }}//consulta de nó anteriorTNo* consultaNoAntLista(TListaEnc *lista, int Posicao){     TNo *Ant; // ponteiro para o no anterior     TNo *Aux; // ponteiro para percorrer a lista     int cont = 0;     Ant = Aux = lista->inicio;     // procura elemento na lista, guardando anterior          while((Aux != NULL) && (cont != Posicao)){          Ant = Aux;          Aux = Aux->prox;          cont++;     }return Ant;}// consulta nó da listaTNo* consultaNoLista(TListaEnc *lista, int Posicao){     TNo *Aux;     int cont = 0;     Aux = lista->inicio;          while((Aux != NULL) && (cont != Posicao)){           Aux = Aux->prox;           cont++;     }     return Aux;}//alterar nó da listavoid alterarLista(TListaEnc *lista){     if(vaziaLista(lista))        cout << endl << "Lista vazia!" << endl << endl;               else{                int Posicao;        exibeLista(lista);        cout << endl << endl << "Digite a posicao a ser alterada: ";        cin >> Posicao;                if(Posicao < 0 || Posicao > (lista->tam - 1))             cout << endl << "Erro: Posicao nao existe!" << endl << endl;             else{                  TNo *P;                  P = consultaNoLista(lista, Posicao);                  cout << endl << endl << "Numero: " << P->dado << endl << endl;                  cout << endl << "Digite o novo Numero: ";                  cin >> P->dado;                  cout << endl << "Numero alterado com sucesso!" << endl << endl;             }        }}//exibir dados da listavoid exibeLista(TListaEnc *lista){     if(vaziaLista(lista))          cout << endl << "Lista vazia!" << endl << endl;          else{               TNo *aux;               aux = lista->inicio;               cout << endl << "Lista de elementos: " << endl << endl;               while(aux != NULL){               cout << aux->dado << " ";               aux = aux->prox;          }          free(aux);          cout << endl;     }}//limpar listavoid esvaziaLista(TListaEnc *lista){     if(vaziaLista(lista))          cout << endl << "A Lista ja esta vazia!" << endl << endl;          else{          TNo *aux;          aux = lista->inicio;                    while (aux != NULL){               lista->inicio = lista->inicio->prox;               free(aux);               aux = lista->inicio;          }                   cout << endl << "Lista esvaziada com sucesso!" << endl << endl;          criaLista(lista);     }}//pesquisar se determinado elemento está na listavoid pesquisaElemento(TListaEnc *lista){                if(vaziaLista(lista))          cout << endl << "Lista vazia!" << endl << endl;          else{                              int elemento, existe;                              TNo *paux;               paux = lista->inicio; //nó auxiliar recebe o primeiro dado da fila                              cout << endl << "Informe o elemento que deseja pesquisar: ";               cin >> elemento;                                // varrendo todos os dados da fila                 while(paux != NULL)                 {                    //verifica se o elemento digitado pelo usuário é igual ao dado da fila                    if(elemento == paux->dado){                    existe = 1; //atribuição caso o elemento seja encontrado na fila                    cout << endl << "Elemento esta na lista!" << endl;                    break; //caso haja elementos repetidos                     }                                  //avançando para o próximo dado da fila                  paux = paux->prox;                                 }//fim do while                                //mensagem caso o elemento não seja encontrado na fila                if(existe != 1){                     cout << endl << "Elemento nao esta na lista!" << endl;                }         }    }void MoveMenor(TListaEnc *lista){          //verifica se a lista está vazia     if(vaziaLista(lista)){          cout << endl << "Lista vazia!" << endl << endl;          }else{                //verifica se a lista tem apenas um elemento                if(lista->tam == 1){                      cout << endl << "Lista com apenas um elemento!" << endl;                      }else{                               //ponteiros auxiliares                                TNo *menor;                               TNo *temp;                               TNo *p; // ponteiro para percorrer a lista                               TNo *aux;                                                                                                              p = lista->inicio;                                                                                              while(p != NULL){                                  aux = lista->inicio;                                   temp = (lista->inicio)->prox;                                         if( temp->dado < aux->dado ){                                      menor = temp;                                   }                                   aux = aux->prox;                                                                      p = p->prox;                               }//fim do while                                                             cout << endl << "Menor elemento da lista: " << menor->dado << endl << endl;     }                   }}

Link para o comentário
Compartilhar em outros sites

@LauraStudent

 

 

Não sei se ainda precisa disso, mas dê uma olhada. Fiz poucos testes, parece estar funcionando..

void MoveMenor(TListaEnc *lista){    //verifica se a lista está vazia    if(vaziaLista(lista))    {        cout << endl << "Lista vazia!" << endl << endl;    }    else    {        //verifica se a lista tem apenas um elemento        if(lista->tam == 1)        {            cout << endl << "Lista com apenas um elemento!" << endl;        }        else        {            //ponteiros auxiliares            TNo *menor;            TNo *p; // ponteiro para percorrer a lista            TNo *ant;            p = lista->inicio;            menor = p;            while (p != NULL)            {                if( p->dado < menor->dado )                {                    menor = p;                }                p = p->prox;            }            cout << endl << "Menor elemento da lista: " << menor->dado << endl << endl;            if (menor != lista->inicio)            {                ant = lista->inicio;                while (ant->prox != menor)                    ant = ant->prox;                if (menor->prox == NULL)                    lista->fim = ant;                ant->prox = menor->prox;                menor->prox = lista->inicio;                lista->inicio = menor;            }        }    }}

Laura, a ideia foi a seguinte. Primeiro eu percorro a lista até identificar o menor dado. Ao ser encontrado, o ponteiro menor estará apontando para esse nó. Esse foi o primeiro passo. Depois, a ideia é manter um ponteiro para um nó anterior ao ponteiro menor. Isso é feito com aquele while. Posicionado o ponteiro para o nó anterior, é fazer o que você já vinha fazendo: trocar as referências dos ponteiros. Ou seja, você faz esse ponteiro menor apontar para o primeiro elemento da lista. Feito isso, faça o ponteiro que guarda o início da lista apontar para esse nó com o menor dado.

 

 

 

 

 

LNW

Link para o comentário
Compartilhar em outros sites

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