Pular para o conteúdo

Lista Encadeada/Ligada - Inverter

Responder tópico
  • Denunciar
  • Indicar

1. Lista Encadeada/Ligada - Inverter

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!

Responder tópico

2. Re: Lista Encadeada/Ligada - Inverter

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

Algoritmo recursivo.

3. Re: Lista Encadeada/Ligada - Inverter

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

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

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

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

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ç

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder