Ir ao conteúdo
  • Cadastre-se
LauraStudent

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

Recommended Posts

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;     }                   }}

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×