Prévia do material em texto
Universidade Estadual de Maringá
Departamento de Informática
Disciplina – 7256
Trabalho 1
Acadêmico: Beatriz Serafim RA: 139858
Camila Araujo Laurindo RA: 139239
Disciplina: Algoritmo e Estrutura de Dados
Curso: Engenharia de Produção
Turma: 02
Professora: Sandra Cossul
Maringá, 10 de Julho de 2025.
INTRODUÇÃO E JUSTIFICATIVA
Neste trabalho, temos como objetivo analisar a utilização da lista simplesmente
encadeada em aplicativos de música.
Hoje em dia, com o avanço das plataformas de streaming, aplicativos de música
como o Spotify e o YouTube Music fazem parte da rotina de milhões de pessoas pelo
mundo. Nesses apps, os usuários podem criar playlists, adicionar e remover música e
ouvir essas playlists em uma determinada sequência. Para que isso funcione é necessário
que o sistema utilize alguma, ou algumas, estrutura de dado que permite essas alterações.
Esse tipo de lista, denominada lista simplesmente encadeada, é formado por
elementos que se ligam uns aos outros através de ponteiros, o que facilita a inclusão ou
exclusão de itens, sem que tenha a necessidade de reorganizar toda a estrutura original.
Isso é útil quando o número de músicas muda com a frequência, como acontece nas
playlists personalizadas.
A escolha, desta aplicação se baseia na sua presença constante no cotidiano e na
capacidade de exemplificar de forma clara os conceitos utilizados na disciplina, como o
uso de struct, ponteiros e alocação de memória.
ESTRUTURA DE DADOS
Uma lista simplesmente encadeada é uma estrutura formada por nós que apontam
para o próximo elemento da lista. Cada ponteiro armazena um dado (no caso analisado,
informações da música) e um ponteiro para o próximo nó.
Essa estrutura é interessante para aplicativos de música pois permite:
Adicionar músicas no fim da playlist;
Remover música de qualquer posição;
Manter a ordem de execução;
Evitar realocação constante de memória.
Na linguagem C, que é a que usamos em aula, essa estrutura é implementada
usando struct e monteiros com malloc().
CÓDIGO EM C
#include
#include
// Estrutura do nó
struct Node {
char title[100]; // título da música
struct Node* next; // ponteiro para a próxima música
};
// Cria uma nova música (nó)
struct Node* newNode(char* title) {
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
strcpy(temp->title, title);
temp->next = NULL;
return temp;
}
// Insere música no final da playlist
void insertEnd(struct Node** head, char* title) {
struct Node* nova = newNode(title);
if (*head == NULL) {
*head = nova;
} else {
struct Node* temp = *head;
while (temp->next != NULL)
temp = temp->next;
temp->next = nova;
}
}
// Mostra a playlist
void display(struct Node* head) {
struct Node* temp = head;
printf("Playlist:\n");
while (temp != NULL) {
printf(" - %s\n", temp->title);
temp = temp->next;
}
}
Código adaptado de: https://www.geeksforgeeks.org/c/menu-driven-program-for-all-
operations-on-singly-linked-list-in-c/.
Ele ilustra claramente a implementação de uma lista simplesmente encadeada, com
funções de inserção e exibição que podem ser mapeadas padra o uso em uma playlist de
aplicativo de música.
CÓDIGO ADAPTADO
Como não encontramos um código parecido ao que utilizamos em sala, optei por
adaptar um dos exemplos que desenvolvemos durante as aulas, ajustando-o para se
encaixar na aplicação analisada neste trabalho.
#include
#include
// Definição da estrutura do nó da lista
struct elemento {
int valor; // Valor armazenado no nó
struct elemento *prox; // Ponteiro para o próximo nó
};
// Ponteiro global para o início da lista (pode ser usado se necessário)
struct elemento *inicio = NULL;
/* Cria uma lista vazia (retorna NULL) */
struct elemento* cria_lista(void) {
return NULL;
}
/* Verifica se a lista está vazia (retorna 1 se sim, 0 se não) */
int lista_vazia(struct elemento *lista) {
return (lista == NULL);
}
/* Insere um novo elemento no final da lista */
struct elemento* insere_final(struct elemento *lista) {
struct elemento *aux, *novo;
int x;
printf("Entre com um número inteiro: ");
scanf("%d", &x);
// Aloca memória para o novo nó e preenche os dados
novo = (struct elemento*) malloc(sizeof(struct elemento));
novo->valor = x;
novo->prox = NULL;
// Se a lista está vazia, o novo nó vira o primeiro
if (lista == NULL) {
lista = novo;
} else {
// Caso contrário, percorre até o último e adiciona o novo nó lá
aux = lista;
while (aux->prox != NULL) {
aux = aux->prox;
}
aux->prox = novo;
}
return lista;
}
/* Exibe todos os elementos da lista */
void visualiza_lista(struct elemento *lista) {
struct elemento *aux = lista;
if (lista_vazia(lista)) {
printf("Lista vazia!\n");
return;
}
// Percorre a lista e imprime cada valor
while (aux != NULL) {
printf("Valor da lista: %d\n", aux->valor);
aux = aux->prox;
}
}
/* Remove um elemento da lista com o valor especificado */
struct elemento* excluir(struct elemento *lista, int valor) {
struct elemento *atual = lista;
struct elemento *anterior = NULL;
if (lista_vazia(lista)) {
printf("Lista vazia. Nada a excluir.\n");
return lista;
}
// Procura o elemento com o valor desejado
while (atual != NULL && atual->valor != valor) {
anterior = atual;
atual = atual->prox;
}
// Elemento não encontrado
if (atual == NULL) {
printf("Elemento não encontrado.\n");
return lista;
}
// Se for o primeiro elemento da lista
if (anterior == NULL) {
lista = atual->prox;
} else {
// Remove o nó ajustando o ponteiro do anterior
anterior->prox = atual->prox;
}
free(atual); // Libera memória do nó removido
printf("Elemento removido com sucesso!\n");
return lista;
}
/* Função principal com menu de opções para o usuário */
int main() {
struct elemento *lista;
int op, v;
lista = cria_lista(); // Inicializa lista vazia
do {
// Exibe o menu de opções
printf("\nMenu - Lista Simplesmente Encadeada\n");
printf("1 - Inserir no Final\n");
printf("2 - Visualizar Lista\n");
printf("3 - Excluir Elemento\n");
printf("4 - Sair\n");
printf("Escolha uma opção: ");
scanf("%d", &op);
// Executa a opção escolhida
switch (op) {
case 1:
lista = insere_final(lista);
break;
case 2:
visualiza_lista(lista);
break;
case 3:
printf("Digite o valor a ser removido: ");
scanf("%d", &v);
lista = excluir(lista, v);
break;
case 4:
printf("Encerrando o programa.\n");
break;
default:
printf("Opção inválida!\n");
}
} while (op != 5); // Continua até o usuário escolher sair
return 0;
}
COMPARAÇÃO COM OS CÓDIGOS DA AULA
O código desenvolvido para este trabalho apresenta similaridades com os
exemplos implementados em aula, por se tratar de uma adaptação direta de
implementaçõespreviamente trabalhadas. Tais semelhanças são evidentes em aspectos
como:
Uso de ponteiros para encadear nós;
Criação e manipulação dinâmica com malloc e free;
Uso de estrutura (struct) para armazenar múltiplos dados;
Já as principais adaptações foram:
Substituições de tipos simples (como int por char) para armazenar strings;
Inclusão de campos específicos da aplicação real (título e artista);
A lógica de inserção foi ajustada para inserir sempre no final, simulando a fila de
execução da playlist.
CONCLUSÃO
O uso da lista simplesmente encadeada em aplicativos de música exemplifica bem
a flexibilidade dessa estrutura. Através da aplicação prática e do código implementado, é
possível compreender os conceitos discutidos em sala e visualizar seu uso em situações
reais.