Lista duplamente encadeada em C

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?

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;

}

1 curtida