Logo Hardware.com.br
hipehope
hipehope Novo Membro Registrado
37 Mensagens 1 Curtida

Como criar e manipular uma lista dinâmica encadeada dentro de outra lista dinâmica em C?

#1 Por hipehope 03/05/2015 - 19:13
Estou com uma enorme dificuldade para conseguir criar uma lista encadeada dinamicamente dentro de outra usando estrutura de dados. Sei criar uma lista dinâmica, porém não consigo criar e manipular outra dentro dela.

Para exemplificar o que quero dizer:

Tenho uma lista de Bandas; cada banda é uma lista de albuns; e cada album é uma lista de musica. E no programa o usuário pode incluir musicas e remove-las quando quiser, incluir álbuns e remove-las quando quiser, e incluir bandas e remove-las quando quiser.

Meu código está assim:

Arquivo.C
#include "biblioteca.h"

ElemM *lm;
ElemA *la;
ElemB *lb;
//---------------------------MAIN--------------------------------->

int main()
{
lb = cria_lista_banda();
la = cria_lista_album();
lm = cria_lista_musica();


system("PAUSE"
return 0;
}
//----------------------------------------------------------------->

ElemB *cria_lista_banda(){
ElemB *lb;
lb = malloc(sizeof(ElemB));
lb->prox_banda = NULL;
return lb;


}

ElemA *cria_lista_album(){
ElemA *la;
la = malloc(sizeof(ElemA));
la->prox_album= NULL;
return la;


}

ElemM *cria_lista_musica(){
ElemM *lm;
lm = malloc(sizeof(ElemM));
lm->prox_musica= NULL;
return lm;


}

int incluir_musica(ElemM *lm, ElemA *la, ElemB *lb, int id_m, int tempo, char *nome_m, int id_a, int id_b){
int valor1, valor2, valor3, i;

valor1 = busca_banda(id_b, lb);
valor2 = busca_album(id_b, id_a, lb, la);
valor3 = busca_musica(id_b, id_a, id_m, lb, la, lm);
if(valor3 == -1) return -1;

ElemB *q;
q = lb->prox_banda;
for(i = 0; i <= valor1; i++){
q = q->prox_banda;
}
ElemA *p;
p = q->albuns_da_banda->prox_album;
for(i = 0; i <= valor2; i++){
p = p->prox_album;
}

ElemM *novo, *novocpy;
p->musicas_do_album->novo = malloc( sizeof(ElemM));
novocpy = p->musica_do_album->novo;
if(novo == NULL) return 0;
novocpy->id_musica = id_m;
novocpy->tempo_da_musica = tempo;
strcpy(novocpy->nome_musica, nome_m);
novocpy->prox_musica = lc->prox_musica;
lm->prox_musica = novocpy;
return 1;
}

int busca_banda(int id, ElemB *lb){
int cont = 0;
ElemB *p;
p = lb->prox_banda;
while(p != NULL && p->id_banda != id){
p = p->prox_banda;
cont++;
}
if(p == NULL) return -1;
return cont;
}

int buscar_album(int id_b, int id_a, ElemB *lb, ElemR *la){
int valor_busca = busca_banda(id_b, lb);
int i;
int cont = 0;

if(valor_busca == -1) return -1;
ElemB *q;
q = lb->prox_banda;
for(i = 0; i <= valor_busca; i++){
q = q->prox_banda;
}
ElemA *p;
p = q->albuns_da_banda->prox_album;
while(p != NULL && p->id_album != id_a){
p = p->prox_album;
cont++;
}

if(p != NULL) return -1;
return cont;

}


int buscar_musica(int id_b, int id_a, int id_m, ElemB *lb, ElemA *la, ElemM *lm){
int valor_busca1 = busca_banda(id_b, lb);
int valor_busca2 = busca_album(id_b, id_a, lb, la);
int i;
int cont = 0;

if(valor_busca1 == -1) return -1;
if(valor_busca2 == -1) return -1;
ElemB *q;
q = lb->prox_banda;
for(i = 0; i <= valor_busca1; i++){
q = q->prox_banda;
}
ElemA *p;
p = q->albuns_da_banda->prox_album;
for(i = 0; i <= valor_busca2; i++){
p = p->prox_album;
}
ElemM *k;
k = p->musica_do_album->prox_musica;
while(k != NULL && k->id_musica != id_m){
k = k->prox_musica;
cont++;
}

if(k != NULL) return -1;
return cont;

}


Arquivo.H (nomeado de biblioteca.h)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct musica{
int id_musica;
int tempo_musica;
char nome_musica[30];
struct musica *prox_musica;
};

typedef struct musica ElemM;

struct album{
int id_album;
char nome_album[30];
struct musica *musica_do_album;
struct album *prox_album;
};

typedef struct album ElemA;

struct banda{
int id_banda;
char nome_banda[30];
struct album *albuns_da_banda;
struct banda *prox_banda;
};

typedef struct banda ElemB;


ElemB *cria_lista_banda();
ElemR *cria_lista_album();
ElemC *cria_lista_musica();
int incluir_musica(ElemM *lm, ElemA *la, ElemB *lb, int id_m, int tempo, char *nome_m, int id_a, int id_b)
int busca_banda(int id, ElemB *lb);
int buscar_album(int id_b, int id_a, ElemB *lb, ElemR *la);
int buscar_musica(int id_b, int id_a, int id_m, ElemB *lb, ElemA *la, ElemM *lm);


Alguem poderia me ajudar? Não consigo encontrar exemplos de uma lista dentro da outra, apenas de uma unica lista. Ficarei muito grato com qualquer ajuda, obrigado.
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#3 Por tpcvasco
12/05/2015 - 10:43
Henry-Keys disse:
Artista - Álbuns
Dentro da estrutura artista inclua um ponteiro que aponte para a uma lista encadeada contendo os álbuns


Ele parece já estar fazendo isso.

hipehope, a princípio, olhando o código, seu programa está certinho. Não entrei no mérito da compilação, até pq vc não mostrou o main(), mas pelo menos as estruturas parecem certas, estão implementadas pra fazer oq vc quer. Qual é o problema q está dando?
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
Henry-Keys
Henry-Keys Geek Registrado
1.8K Mensagens 235 Curtidas
#4 Por Henry-Keys
12/05/2015 - 10:48
tpcvasco disse:
Ele parece já estar fazendo isso.

hipehope, a princípio, olhando o código, seu programa está certinho. Não entrei no mérito da compilação, até pq vc não mostrou o main(), mas pelo menos as estruturas parecem certas, estão implementadas pra fazer oq vc quer. Qual é o problema q está dando?

Nem havia lido o código partindo do pressuposto que a solução não estava implementada. Agora fiquei confuso.
jofrelscalvet
jofrelscalve... Veterano Registrado
1.3K Mensagens 51 Curtidas
#5 Por jofrelscalve...
18/05/2015 - 19:19
Você parece ter o código das inserções pronto. Só não o usa. Não tem também o código das remoções.
Estou enferrujado demais em C para tentar ajudar com código. Também falar em 3 niveis é muito chato. Vou simplificar um pouco pensando apenas em 2 niveis: musicas pertencem a uma lista (álbum ?) e albuns pertencem a uma lista.
Usei negrito para tentar destacar alguns "requisitos usualmente implicitos(seja por qual razão for)" e sublinhado para tentar falar de nome de variavel.

Primeiro eu preciso ter as 2 listas (vazias). Isso é feito com suas funções de cria_lista_ .
Não posso incluir uma música fora de album, mas posso criar um album sem música.
Suponhamos que eu queira inserir uma música “ciranda cirandinha” de um álbum “infantil”. Para isso preciso ver se na lista de álbuns existe “infantil”, e caso não exista criá-lo (para saber se existe o álbum eu tenho de pegar o endereço inicial da lista e ir andando álbum a álbum até encontrar “infantil” ou a lista terminar). Uma vez que eu tenho o album, eu preciso procurar pela música “ciranda cirandinha” e caso não a ache preciso cria-la.
Para remover a música “ciranda cirandinha” de um álbum “infantil” primeiro devo encontrar o álbum na lista de álbuns. (a partir do endereço inicial da lista vou “andando” até achar o álbum). Depois de encontrado o inicio da lista de músicas eu coloco esse endereço numa variavel anterior e coloco o endereço do próximo elemento na variável próximo, vou “andando” até que este elemento seja a música “ciranda cirandinha”, sempre atualizando as variáveis com os endereços anterior e próximo. Volto para o endereço anterior e mudo o endereço do elemento seguinte (que contem o endereço de “ciranda cirandinha”) para o endereço de próximo (que contem a musica seguinte a “ciranda cirandinha”).
Se eu remover um álbum automaticamente removo todas as músicas que estão nele. Isso é feito achando o álbum (por exemplo” infantil”) e colocando no elemento anterior a ele (por exemplo “cantigas de ninar”) que o elemento seguinte é aquele que vem depois de “infantil” (por exemplo “músicas de todos os tempos”).

Apesar dos pesares espero que isto ajude um pouquinho...
Melhore o futuro do fórum: Diga se a dica funcionou ou conte-nos como conseguiu resolver a sua dúvida!
Se eu errar ou for pouco claro, reclame! Quando possivel eu tentarei melhorar.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal