Ir para conteúdo
Fórum Script Brasil
  • 0

Criar lista duplamente encadeada com método inverte()


lucca.bertolucci

Pergunta

Você deve implementar uma lista duplamente encadeada adicionando o método inverte(), que inverte a ordem dos elementos da lista sem modificar o conteúdo de cada nó. O método não pode fazer alteração do valor armazenado nos nós, podendo alterar somente as referências aos atributos próximo e anterior dos mesmos. Ou seja, não serão aceitas soluções que façam as trocas de valores dos nós, os nós devem mudar de posição, por meio da manipulação de ponteiros.

Obs: não devem ser utilizadas estruturas de dados adicionais para a solução do problema

não consegui fazer a função inverte funcionar

meu código:
 

#include <iostream>
 
using namespace std;
 
typedef int dado;
 
class noh {
    friend class lista;
    private:
        dado valor;
        noh* proximo;
        noh* anterior;
    public:
        noh(dado d);
};
 
noh::noh(dado d) {
    valor = d;
    proximo = NULL;
    anterior = NULL;
   
}
 
class lista {
    private:
        noh* primeiro;
        noh* ultimo;
        int tamanho;
    public:
        lista();
        ~lista();
        bool listaVazia(){return primeiro == NULL;};
        void insere(dado valor);
        lista & operator=(const lista& L2);
        void imprime();
        void inverte();
        void imprimeReverso();
};
 
lista::lista() {
    primeiro = NULL;
    ultimo = NULL;
    tamanho = 0;
}
 
lista::~lista( ) {
    noh* aux = primeiro;
    noh* temp;
 
    while (aux != NULL) {
        temp = aux;
        aux = aux->proximo;
        delete temp;
    }
    primeiro = NULL;
    ultimo = NULL;
    tamanho = 0;
}
 
void lista::insere(dado valor) {
    noh* novo = new noh(valor);
    if(listaVazia()){
        primeiro = novo;
    }else{
        ultimo->proximo = novo;
        novo->anterior = ultimo;
    }
    ultimo = novo;
    tamanho++;
}
 
void lista::inverte() {
    noh* novo = new noh(valor);
 
}
 
lista & lista::operator=(const lista& L2){
    noh* aux;
    if(!listaVazia()){
        aux = primeiro;
        noh* temp;
        cout << aux->valor << endl;
        while (aux != NULL) {
            temp = aux;
            aux = aux->proximo;
            delete temp;
        }
        primeiro = NULL;
        ultimo = NULL;
    }
   
    aux = L2.primeiro;
    while (aux != NULL) {
        insere(aux->valor);
        aux = aux->proximo;
    }
 
    return *this;
}
/*
void lista::inverte(){
    noh* aux22 = new noh;
    aux22 = primeiro;
    primeiro = ultimo;
    ultimo = aux22;
    for(int i = 0; i < tamanho; i++){
        noh* ptrAux;
        ptrAux = aux22->anterior;
        aux22->anterior = aux22->proximo;
        aux22->proximo = ptrAux;
        aux22 = aux22->anterior;
    }
}
*/
 
void lista::imprime(){
    noh* aux = primeiro;
    while(aux != NULL){
        cout << aux->valor << " ";
        aux = aux->proximo;
    }
    cout << endl;
}
 
void lista::imprimeReverso(){
    noh* aux = ultimo;
    while(aux != NULL){
        cout << aux->valor << " ";
        aux = aux->anterior;
    }
    cout << endl;
}
 
int main() {
    lista minhalista;
    char opcao;
 
    while (opcao != 'Q')
    {
        cout << "================= Menu ====================" << endl;  
        cout << endl << "I: Insere uma palavra na lista original" << endl;
        //cout << endl << "X: Executa a função inverte" << endl;
        cout << endl << "P: Imprime a lista em ordem direta" << endl;
        cout << endl << "R: Imprime a lista em ordem reversa" << endl;
        cout << endl << "Q: Encerra os comandos" << endl;
       
        cin >> opcao;
 
    switch (opcao)
        {
            case 'I':
                int valor;
                cin >> valor;
                minhalista.insere(valor);
                cout << "Voce inseriu um novo dado" << endl;
                break;
             /*
            case 'x':
                minhalista.inverte();
                cout << "Você inseriu um novo dado";
                break;
             */
            case 'P':
                minhalista.imprime();
                break;
 
            case 'R':
                minhalista.imprimeReverso();
                break;  
 
        }

 

 

    };
   


 
    return 0;
}
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...