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;
}