/* Programa que implementa o Tipo Abstrato de Dados Lista com alocacao dinamica * Objetivo: organizar discos em uma estrutura de dados que ilustra o funcionamento real de uma * lista de compras real * Restricoes: a lista consiste em elementos discos, pois estah adaptado para este programa * Observacoes: o tipo bool estah definido em utils.h e consiste em um int para representar valores booleanos * * Autores: Bruno Freitas Tissei e Felipe Shi Iu Wu * Disciplina: Algoritmos e Estrutura de Dados II * Entrega: 20/11/2015 */ #include "lista.h" // inicia a lista void inicLista(tipoLista *lista) { imprimeLog("Iniciei a Lista usando alocacao dinamica"); lista->inicio = (disco*) malloc(sizeof(disco)); lista->fim = lista->inicio; lista->fim->prox = NULL; } // verifica se a lista estah vazia (vazia -> true) bool vaziaLista(tipoLista lista) { return lista.fim == lista.inicio; } // insere elemento na lista - eh necessario fornecer o id, o nome do artista, o nome e o valor do album void insereLista(tipoLista *lista, int id, char *artista, char *album, float valor) { sprintf(straux, "Inseri o elemento disco = (%d, %s, %s, %.2f) na Lista", id, artista, album, valor); imprimeLog(straux); lista->fim->prox = (disco*) malloc(sizeof(disco)); lista->fim = lista->fim->prox; lista->fim->id = id; strcpy(lista->fim->artista, artista); strcpy(lista->fim->album, album); lista->fim->valor = valor; lista->fim->prox = NULL; } // remove elemento da lista e retorna o valor do disco removido- eh necessario fornecer o id // do disco que serĂ¡ removido // se a lista estiver vazia imprime no log e retorna -1.0 (convencao adotada para melhor funcionamento // do programa principal para descrever lista vazia) // se apos percorrer a lista, o id nao estiver nela retorna -2.0 (convencao adotada para melhor // funcionamento do programa principal para descrever disco nao encontrado) float removeLista(tipoLista *lista, int id) { disco *aux, *rem; bool achou = false; float valorAux; if (vaziaLista(*lista)) { valorAux = -1.0; imprimeLog("ERRO: impossivel remover, Lista Vazia!"); } else { aux = lista->inicio; while (aux->prox != NULL) { if (aux->prox->id == id) { achou = true; valorAux = aux->prox->valor; sprintf(straux, "Removi o elemento disco = (%s, %s, %.2f) da posicao %d da Lista", aux->prox->artista, aux->prox->album, aux->prox->valor, id); imprimeLog(straux); if (aux->prox == lista->fim) { free(aux->prox); lista->fim = aux; lista->fim->prox = NULL; } else { rem = aux->prox; aux->prox = aux->prox->prox; free(rem); } break; } aux = aux->prox; } if (!achou) valorAux = -2.0; } return valorAux; } // imprime a lista, se a lista estiver vazia informa ao usuario e nao ao log, que soh // mostra um conjunto vazio void imprimeLista(tipoLista lista) { disco *aux; if (vaziaLista(lista)) { printf("Lista vazia\n"); imprimeLog("Veja a Lista: [ ]"); } else { imprimeLog("Veja a Lista: ["); aux = lista.inicio->prox; while (aux != NULL) { sprintf(straux, "\t(%d, %s, %s, %.2f)", aux->id, aux->artista, aux->album, aux->valor); imprimeLog(straux); printf(" %d) Artista: %s\n Album: %s\n Valor: R$%.2f\n", aux->id, aux->artista, aux->album, aux->valor); aux = aux->prox; } imprimeLog("]"); } }