Lista Encadeada/Ligada - Inverter

1. Lista Encadeada/Ligada - Inverter

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 21/10/2015 - 23:24h

Boa noite!

Estou com um exercício de Lista encadeada para terminar. A parte do Inserir, Pesquisar, Excluir, Exibir Lista já estão tudo ok.

Falta apenas fazer a função Inverter, onde os dados da lista serão todos invertidos (o último será o primeiro e por aí vai...). Aí quando eu rodar o Exibir Lista novamente será impresso na tela os dados já invertidos. E se eu rodar o Inverter denovo, volta ao contrário. Parece simples, mas não estou conseguindo nem começar.

o código fonte do que foi elaborado até o momento está aqui: http://pastebin.com/6bvSdnx

Desde já agradeço!


  


2. Re: Lista Encadeada/Ligada - Inverter

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/10/2015 - 02:34h

Algoritmo recursivo.


3. Re: Lista Encadeada/Ligada - Inverter

Daniel Hilst Selli
danielhilst

(usa Arch Linux)

Enviado em 22/10/2015 - 08:08h


Amigo o link que vc postou ta quebrado. A lista é linkada ou duplamente linkada?

Att


4. Re: Lista Encadeada/Ligada - Inverter

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 22/10/2015 - 09:48h


Desculpa

Este é o código feito até o momento:

#include <iostream>
#include <string.h>

using namespace std;

class Node
{
friend class Lista;
private:
Node* proximo;
string valor;
public:
Node(char* val)
{
valor = val;
proximo = NULL;
}
};

class Lista
{
private:
Node* primeiro;
int tamanho;
public:
Lista()
{
primeiro = NULL;
}
Lista(Node* pri)
{
primeiro = pri;
tamanho = 1;
}
~Lista()
{
if (primeiro)
{
Node *p = primeiro;
Node *prox = primeiro->proximo;

while (p)
{
prox = p->proximo;
delete p;
p = prox;
}
}

}
bool Inserir(char* val)
{
tamanho++;
Node *novoNode = new Node(val);
if (!primeiro)
primeiro = novoNode;
else
{
Node *p = primeiro;
while (p->proximo)
p = p->proximo;
p->proximo = novoNode;
}
return true;
}
bool Excluir(char* val)
{
if (!primeiro)
return false;
Node *p = primeiro;
Node *ant = primeiro;
while (_stricmp(val, p->valor.c_str()))
{
ant = p;
if (p->proximo)
p = p->proximo;
else
return false;
}
if (ant == p)
{
if (tamanho == 1)
{
tamanho = 0;
primeiro = NULL;
}
else
{
primeiro = p->proximo;
tamanho = 1;
}
return true;
}
ant->proximo = p->proximo;
delete p;
tamanho--;
return true;
}

void ImprimirLista()
{
cout << "**********************************"<< endl;
if (!primeiro)
return;
Node *p = primeiro;
while (p)
{
cout << p->valor << endl;
p = p->proximo;
}
cout << "**********************************"<< endl;
}

bool Pesquisar(char* val)
{
if (!primeiro)
return false;
Node *p = primeiro;
// Node *ant = primeiro;
while (_stricmp(val, p->valor.c_str()))
{
// ant = p;
if (p->proximo)
p = p->proximo;
else
return false;
}
return true;
}

void Inverter()
{

}

};

int main()
{
Lista *l = new Lista();
l->Inserir("joao");
l->Inserir("maria");
l->Inserir("jose");
l->ImprimirLista();
// l->Inverter();
// l->ImprimirLista();
l->Excluir("joao");
l->ImprimirLista();
cout << l->Pesquisar("maria") << endl;
l->Excluir("joao");
l->ImprimirLista();
l->Excluir("maria");
l->ImprimirLista();
delete l;
// return 0;
}



5. Re: Lista Encadeada/Ligada - Inverter

Daniel Hilst Selli
danielhilst

(usa Arch Linux)

Enviado em 22/10/2015 - 13:13h

Aqui está, deixo a adição da checagem pra se a lista for vazia ou tiver um unico elemento por sua conta ;)


void Inverter()
{
Node *p = primeiro;
Node *ant = NULL;

while (p->proximo) {
Node *prox = p->proximo;
p->proximo = ant;
ant = p;
p = prox;
}
p->proximo = ant;
primeiro = p;
}





6. Re: Lista Encadeada/Ligada - Inverter

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 22/10/2015 - 16:20h

show de bola! funcionou certinho! estava pensando em tanta coisa complexa e não imaginei que fosse tão simples assim

muito obrigado!!!



7. Re: Lista Encadeada/Ligada - Inverter

Daniel Hilst Selli
danielhilst

(usa Arch Linux)

Enviado em 22/10/2015 - 16:27h


Haha, na verdade eu quebrei um poco a cabeça tb, faz teeeeeeempo que mechi com isso. Mas fica tranquilo que no mundo real vc nunca vai precisar inverter uma lista linkadar rsrsrs, se precisar, use uma duplamente linkada :)

Abç






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts