1.3. Listas Duplamente Ligadas
1.3. Listas Duplamente Ligadas
1.3. Listas Duplamente Ligadas
Dados
Nome do professor: Bruno Leonardo Andrade Silva
Aula que se refere: Listas Duplamente Ligadas
Listas Duplamente Ligadas
● Uma Lista Duplamente Ligada é uma estrutura de dados onde cada nó da lista possui três
campos:
○ um campo contendo a informação;
○ um ponteiro direcionando para o próximo elemento;
○ um ponteiro direcionando para o elemento anterior.
Listas Duplamente Ligadas
https://saulo.arisa.com.br/wiki/index.php/Listas_Duplamente_Encadeadas
Listas Duplamente Ligadas
● Uma playlist é um exemplo prático de um caso de uso para uma lista duplamente ligada.
● Com uma lista duplamente ligada, você pode navegar pela playlist tanto para frente
quanto para trás de maneira eficiente.
Estrutura de uma Lista Duplamente Ligada
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
if (playlist->inicio == NULL) {
playlist->inicio = novaMusica;
return;
}
atual->proximo = novaMusica;
novaMusica->anterior = atual;
}
Adicionar elementos à lista duplamente ligada
(posição)
void inserirMusicaPorPosicao(Playlist *playlist, int posicao, const char *titulo) {
Musica *novaMusica = (Musica *)malloc(sizeof(Musica));
strcpy(novaMusica->titulo, titulo);
if (pos == NULL) {
novaMusica->anterior = NULL;
novaMusica->proximo = playlist->inicio;
if (playlist->inicio != NULL) {
playlist->inicio->anterior = novaMusica;
}
playlist->inicio = novaMusica;
}
Adicionar elementos à lista duplamente ligada
(posição)
else {
novaMusica->anterior = pos->anterior;
novaMusica->proximo = pos;
if (pos->anterior != NULL) {
pos->anterior->proximo = novaMusica;
} else {
playlist->inicio = novaMusica;
}
pos->anterior = novaMusica;
}
}
Remover elementos da lista duplamente ligada
void removerMusica(Playlist *playlist, int posicao) {
if (playlist->inicio == NULL) {
printf("A playlist esta vazia.\n"); return;
}
if (musicaRemover == NULL) {
printf("Posicao invalida.\n"); return;
}
if (musicaRemover->anterior != NULL) {
musicaRemover->anterior->proximo = musicaRemover->proximo;
} else {
playlist->inicio = musicaRemover->proximo;
}
if (musicaRemover->proximo != NULL) {
musicaRemover->proximo->anterior = musicaRemover->anterior;
}
free(musicaRemover);
}
Imprimir lista
void imprimirPlaylist(Playlist *playlist) {
printf("\n========================== PLAYLIST ==========================\n");
Musica *atual = playlist->inicio;
int posicao = 0;
while (atual != NULL) {
printf("[%d] %s\n", posicao, atual->titulo);
atual = atual->proximo;
posicao++;
}
printf("==============================================================\n");
}
Método principal – Parte 1
int main() {
Playlist minhaPlaylist = {NULL};
Musica *musicaAtual = NULL;
imprimirPlaylist(&minhaPlaylist);
int opcao;
do {
printf("\nESCOLHA UMA OPCAO:\n\n");
printf("1 - Tocar Proxima\n");
printf("2 - Tocar Anterior\n");
printf("3 - Inserir Musica no Fim\n");
printf("4 - Inserir Musica no Meio\n");
printf("5 - Remover Musica\n");
printf("0 - Sair\n");
scanf("%d", &opcao);
Método principal – Parte 2
switch (opcao) {
case 1:
if (musicaAtual == NULL) {
musicaAtual = minhaPlaylist.inicio;
} else if (musicaAtual->proximo != NULL) {
musicaAtual = musicaAtual->proximo;
} else {
printf("Nao ha proxima musica.\n");
}
if (musicaAtual != NULL) {
printf("Tocando: %s\n", musicaAtual->titulo);
}
break;
case 2:
if (musicaAtual != NULL && musicaAtual->anterior != NULL) {
musicaAtual = musicaAtual->anterior;
printf("Tocando: %s\n", musicaAtual->titulo);
} else {
printf("Nao ha musica anterior.\n");
}
break;
Método principal – Parte 3
case 3:
{
char titulo[100];
printf("Digite o titulo da musica: ");
scanf("%s", titulo);
inserirMusicaNoFim(&minhaPlaylist, titulo);
imprimirPlaylist(&minhaPlaylist);
}
break;
case 4:
{
char titulo[100];
int posicao;
printf("Digite o titulo da musica: ");
scanf("%s", titulo);
printf("Digite a posicao de insercao da musica (comecando em 0): ");
scanf("%d", &posicao);
inserirMusicaPorPosicao(&minhaPlaylist, posicao, titulo);
imprimirPlaylist(&minhaPlaylist);
}
break;
Método principal – Parte 4
case 5:
{
int posicao;
printf("Digite a posicao da musica a ser removida (comecando em 0): ");
scanf("%d", &posicao);
removerMusica(&minhaPlaylist, posicao);
imprimirPlaylist(&minhaPlaylist);
}
break;
case 0:
printf("Encerrando a playlist.\n");
break;
default:
printf("Opcao invalida.\n");
}
} while (opcao != 0);
Método principal – Parte final
Musica *atual = minhaPlaylist.inicio;
while (atual != NULL) {
Musica *temp = atual;
atual = atual->proximo;
free(temp);
}
return 0;
}
Vamos praticar?
Referências Bibliográficas