Lista duplamente encadeada em C

1 resposta Resolvido
c
JheannyC

Eu andei pesquisando alguns tópicos sobre a linguagem C sobre fazer listas duplamente encadeadas. Sei que tem a manipulação de ponteiros e inicialização da lista e eu queria fazer o seguinte: Através da leitura de um arquivo adicionar um char e um int a essa lista, porém não estou saindo do lugar. Por exemplo, queria criar uma lista dupla encadeada que me permita adicionar a idade e o nome de pessoas e no final, retornar a pessoa que tem menos idade, junto com o nome dela. Quem puder me dar umas dicas sobre isso, ou o caminho a seguir, ficarei agradecida!
É possível criar uma lista duplamente encadeada com dois nós? Caso sim, dá pra criar com um int e um char?
Como ficaria a inicialização da lista e a criação?

1 Resposta

JonathanCR
Solucao aceita

Da! segue um exemplo de uma lista dupla encadeada que fiz na faculdade, como voce sabe voce precisara criar uma struct que por exemplo poderia se chamar “Pessoa” e conter nome e idade, e tambem alterar o elemento, ja que nao contera música e sim Pessoa. De uma olhada no código, é interessante. Por fim acho q oq resolverá seu problema em obter um retorno sera fazer um while e percorrer toda a lista e ir armazenando em variaveis temporarias a pessoa q se encaixa com oq voce procura.

#ifndef DUPLAENCADEADA_H

#define DUPLAENCADEADA_H

#include <iostream>

#include <string>

using namespace std;

struct Musica {

string titulo;

string artista;

};

struct Elemento {

Musica faixa;

Elemento *anterior;

Elemento *proximo;

};

struct Lista {

Elemento *primeiro;

Elemento *ultimo;

int qtd;

};

void iniciar_lista(Lista &l) {

l.primeiro = NULL;

l.ultimo = NULL;

l.qtd = 0;

}

bool inserir_inicio(Lista &l, Musica musica) {

Elemento *novaFaixa = new Elemento;

if (novaFaixa == NULL)

return false;

novaFaixa->faixa = musica;

novaFaixa->proximo = l.primeiro;

l.primeiro = novaFaixa;

novaFaixa->anterior = NULL;

if (l.qtd==0)

l.ultimo = novaFaixa;

else

novaFaixa->proximo->anterior = novaFaixa;

l.qtd++;

return true;

}

bool inserir_fim(Lista &l, Musica musica) {

Elemento *novaFaixa = new Elemento;

if (novaFaixa == NULL)

return false;

novaFaixa->faixa = musica;

novaFaixa->anterior = l.ultimo;

l.ultimo= novaFaixa;

novaFaixa->proximo = NULL;

if (l.qtd == 0)

l.primeiro = novaFaixa;

else

novaFaixa->anterior->proximo = novaFaixa;

l.qtd++;

return true;

}

bool remover_inicio(Lista &l) {

if (l.qtd == 0)

return false;

Elemento *temp = l.primeiro;

l.primeiro = l.primeiro->proximo;

delete temp;

if (l.qtd == 1)

l.ultimo = NULL;

else

l.primeiro->anterior = NULL;

l.qtd–;

return true;

}

bool remover_fim(Lista &l) {

if (l.qtd == 0)

return false;

Elemento *temp = l.ultimo;

l.ultimo = l.ultimo->anterior;

if (l.qtd == 1)

l.primeiro = NULL;

else

l.ultimo->proximo = NULL;

l.qtd–;

delete temp;

return true;

}

bool inserir_posicao(Lista &l, Musica musica, int posicao) {

if (posicao <= 0)

return inserir_inicio(l, musica);

if (posicao >= l.qtd)

return inserir_fim(l, musica);

Elemento *novaFaixa = new Elemento;

if (novaFaixa == NULL)

return false;

novaFaixa->faixa = musica;

Elemento *temp = l.primeiro;

for (int x = 1;x < posicao+1;x++) {

temp = temp->proximo;

}

novaFaixa->proximo = temp;

novaFaixa->anterior = temp->anterior;

novaFaixa->anterior->proximo=novaFaixa;

novaFaixa->proximo->anterior=novaFaixa;

l.qtd++;

return true;

}

bool remover_posicao(Lista &l, int posicao) {

if (posicao<0 || posicao >l.qtd)

return false;

if (posicao == 0)

return remover_inicio(l);

if (posicao == l.qtd-1)

return remover_fim(l);

Elemento *temp = l.primeiro;

for (int x = 1;x < posicao+1;x++) {

temp = temp->proximo;

}

temp->anterior->proximo = temp->proximo;

temp->proximo->anterior = temp->anterior;

l.qtd–;

delete temp;

return true;

}

void escrever_faixas_cd(Lista l){

Elemento *temp=l.primeiro;

int x=1;

while (temp!=NULL){

cout<<"Faixa "<<x<<": "<<temp->faixa.artista<<endl;

cout<<"Faixa "<<x<<": "<<temp->faixa.titulo<<endl;

temp=temp->proximo;

x++;

}

}

#endif // DUPLAENCADEADA_H_INCLUDED


// duplamenteencadeada.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <iostream>

#include "duplaencadeada.h"

int main()

{

Musica faixa1, faixa2, faixa3, faixa4, faixa5;

faixa1.artista = "jonathan";

faixa1.titulo = "nobody yes door";

faixa2.artista = "carlos";

faixa2.titulo = "mijoleta";

faixa3.artista = "faixa3.artista";

faixa3.titulo = "faixa3.titulo";

faixa4.artista = "faixa4.artista";

faixa4.titulo = "faixa4.titulo";

faixa5.artista = "faixa5.artista";

faixa5.titulo = "faixa5.titulo";

Lista CD;

iniciar_lista(CD);

inserir_inicio(CD, faixa1);

inserir_fim(CD,faixa2);

inserir_fim(CD,faixa4);

inserir_posicao(CD,faixa3,2);

inserir_inicio(CD,faixa5);

escrever_faixas_cd(CD);

cout<<endl;

remover_posicao(CD,2);

remover_inicio(CD);

remover_fim(CD);

escrever_faixas_cd(CD);

return 0;

}

Criado 6 de março de 2019
Ultima resposta 6 de mar. de 2019
Respostas 1
Participantes 2