Skip to content

Instantly share code, notes, and snippets.

@Drowze
Created May 13, 2015 22:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Drowze/60797ad91a20e8ddc75b to your computer and use it in GitHub Desktop.
Save Drowze/60797ad91a20e8ddc75b to your computer and use it in GitHub Desktop.
#estruturas_de_dados
no_musica *cria_musica(){
s_musica nova_musica;
printf("Digite o nome do artista: ");
__fpurge(stdin); fgets(nova_musica.artista, 32, stdin);
printf("Digite o titulo da faixa: ");
__fpurge(stdin); fgets(nova_musica.titulo, 32, stdin);
printf("Digite o genero da faixa: ");
__fpurge(stdin); fgets(nova_musica.genero, 32, stdin);
printf("Digite o ano da faixa: ");
scanf("%d", &nova_musica.ano);
printf("Para finalizar, digite o nome do arquivo: ");
__fpurge(stdin); fgets(nova_musica.nome_arquivo, 32, stdin);
time_t t = time(NULL);
nova_musica.data_cria = *(localtime ( &t ) );
nova_musica.data_mod = nova_musica.data_cria;
no_musica *novo_no;
novo_no = struct_para_no(nova_musica);
return novo_no;
}
no_musica *struct_para_no(s_musica musica){
no_musica *novo_no = (no_musica *)malloc(sizeof(no_musica));
novo_no->prox = NULL;
novo_no->ant = NULL;
novo_no->cadastro = musica;
return novo_no;
}
int adicionar_musica(no_musica **lista, no_musica *novo_no){ //deve armazenar de forma alfabética
/*
considerei eliminar o *anterior, mas isso me seria um problema
na hora de adicionar um elemento ao final da lista, já que aux
apontaria para NULL e eu não poderia fazer aux->ant->prox = novo_no,
como seria desejado.
Para resolver esse problema, o ideal seria implementar uma lista
circular, possivelmente com nó cabeça.
Fica pra próxima.
*/
no_musica *aux = *lista;
no_musica *anterior = NULL;
if(aux == NULL){ //Anteriormente, lista vazia
*lista = novo_no;
novo_no->prox = NULL;
novo_no->ant = NULL;
return 0;
}
else{
while(aux != NULL && (strcmp(aux->cadastro.titulo, novo_no->cadastro.titulo) < 0 ) ) { //eqnt aux->titulo for anterior a no->titulo, ande; http://i.imgur.com/4Q7oKLG.png
anterior = aux;
aux = aux->prox;
}
if(aux == NULL){ //Insere no final
anterior->prox = novo_no;
novo_no->ant = anterior;
novo_no->prox = NULL;
}
else{
if(anterior == NULL){ //se ele cai aqui, insere antes do primeiro
*lista = novo_no;
novo_no->ant = NULL; //ou igual anterior
novo_no->prox = aux;
aux->ant = novo_no;
}
else{ //se ele cai aqui, pode ser em qualquer outro espaço
anterior->prox = novo_no;
novo_no->ant = anterior;
novo_no->prox = aux;
aux->ant = novo_no;
}
}
return 0;
}
return 1; //Erro: não foi possível adicionar na lista (?)
}
int main(void){
int op;
char titulo[32], artista[32];
no_musica *Lista = NULL; //Ponteiro para lista de músicas inicialmente vazia
no_musica *ListaRemovidos = NULL; //ponteiro para "lixeira"
no_musica *no = NULL;
le_arquivo(&Lista);
do{
puts("\nDigite a opcao desejada:");
puts("1- Inserir musica");
scanf("%d", &op);
switch(op){
case 1:
if(adicionar_musica(&Lista, cria_musica()) != 0){
printf("Erro: impossivel adicionar a musica.");
__fpurge(stdin); getchar();
}
else{
printf("Musica adicionada com sucesso.");
__fpurge(stdin); getchar();
}
break;
}
}while(op != 0);
if(escreve_no_arquivo(Lista) != 0)
printf("Erro: impossivel salvar registros");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment