Created
May 13, 2015 22:59
#estruturas_de_dados
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 (?) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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