Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

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.

Mais conteúdos dessa disciplina