O documento descreve as listas simplesmente encadeadas, suas representações e operações básicas. Uma lista simplesmente encadeada é composta por nós ligados por ponteiros, onde cada nó contém um valor e um ponteiro para o próximo nó. As operações básicas incluem inserção e remoção de nós no início ou final da lista e percorrer a lista.
2. Lista
Simplesmente
Encadeada
• Cada elemento, chamado de nó, contém um
valor e um ponteiro que aponta para o
próximo nó na lista.
• Só existe o ponteiro para o próximo nó.
• O primeiro nó da lista é chamado de cabeça
(head) e o último nó é apontado por um
ponteiro especial chamado de cauda (tail),
que aponta para NULL ou para um valor
sentinela que indica o final da lista.
3. Representação
• Nesta imagem, cada nó é representado por um
retângulo contendo um valor (no caso, os
números 1 a 5) e uma seta que aponta para o
próximo nó na lista.
• O primeiro nó (cabeça) é o número 1, que
possui um ponteiro que aponta para o número
2, o segundo nó na lista.
• O último nó (cauda) é o número 5, que possui
um ponteiro que aponta para NULL, indicando
que este é o último nó na lista.
4. Operações Básicas
• As operações básicas suportadas por uma lista simplesmente encadeada são:
• inserir um novo nó no início da lista (push);
• inserir um novo nó no final da lista (append);
• remover o primeiro nó da lista (pop);
• percorrer a lista (traversal) e;
• buscar um nó com um determinado valor (search).
• A lista simplesmente encadeada é uma estrutura de dados flexível e eficiente para inserção e
remoção de elementos no início ou no final da lista, mas pode ser menos eficiente para acesso
aleatório aos elementos em comparação com outras estruturas de dados, como arrays e listas
duplamente encadeadas.
5. Aplicação
• As listas simplesmente encadeadas são amplamente utilizadas em algoritmos e programas que exigem
inserção e remoção frequentes de elementos no início ou no final da lista, como é o caso de:
1. Implementações de pilhas e filas: As pilhas e filas são estruturas de dados que utilizam listas
simplesmente encadeadas para armazenar os elementos. Em uma pilha, os elementos são adicionados
e removidos sempre no topo da pilha, enquanto em uma fila, os elementos são adicionados no final e
removidos no início da fila.
2. Gerenciamento de memória: Em linguagens de programação como C e C++, a alocação dinâmica de
memória é frequentemente realizada usando listas simplesmente encadeadas. Cada nó da lista
representa uma região de memória disponível, e a inserção e remoção de nós na lista é usada para
gerenciar a alocação e liberação de memória.
3. Sistemas de busca de arquivos: Alguns sistemas operacionais usam listas simplesmente encadeadas
para armazenar informações sobre arquivos em um diretório. Cada nó na lista representa um arquivo e
seu conteúdo, e os ponteiros entre os nós são usados para navegar entre os arquivos.
6. Lista Simplesmente Encadeada Ordenada
• Estrutura de dados na qual os elementos são armazenados em nós que contêm um valor e um ponteiro para o próximo nó na lista.
• Os nós são armazenados em ordem crescente ou decrescente, com base em seu valor.
• Ao contrário de uma lista simplesmente encadeada não ordenada, em que os elementos podem ser inseridos em qualquer ordem e a lista pode
precisar ser percorrida inteiramente para encontrar um elemento específico.
• Uma lista simplesmente encadeada ordenada permite que você localize rapidamente um elemento específico na lista.
• Isso é possível porque os elementos são armazenados em ordem, o que significa que você pode usar uma busca binária para localizar
rapidamente o elemento desejado.
• Inserir ou remover elementos de uma lista simplesmente encadeada ordenada pode ser mais complicado do que em uma lista simplesmente
encadeada não ordenada, já que você precisa manter a ordem dos elementos na lista.
• Para inserir um novo elemento na lista, você precisa encontrar o lugar correto para inseri-lo, levando em conta a ordem dos elementos
existentes.
• Para remover um elemento, você precisa atualizar os ponteiros para garantir que a lista permaneça ordenada após a remoção.
7. Representação
• Nesta lista, cada nó contém um valor numérico e um ponteiro para o
próximo nó na lista.
• Os valores são armazenados em ordem crescente, então o nó com o valor
2 está no início da lista e o nó com o valor 10 está no final.
• O ponteiro do último nó aponta para NULL, indicando que a lista termina
ali.
8. Aplicação
• As listas simplesmente encadeadas ordenadas são úteis em diversas aplicações em que é necessário armazenar e gerenciar
um conjunto de elementos que precisam estar em ordem.
• Alguns exemplos de uso de listas simplesmente encadeadas ordenadas incluem:
1. Listas telefônicas ou de contatos em que os nomes são armazenados em ordem alfabética para facilitar a busca.
2. Listas de tarefas em que as tarefas são organizadas por prioridade ou data de vencimento.
3. Sistemas de classificação ou ranking em que os elementos são organizados por ordem de pontuação ou
desempenho.
4. Bibliotecas que armazenam livros em ordem alfabética ou por categoria.
5. Armazenamento de dados em bancos de dados, em que os registros são armazenados em ordem crescente ou
decrescente com base em um valor chave.
• Esses são apenas alguns exemplos de aplicações em que as listas simplesmente encadeadas ordenadas podem ser úteis.
Basicamente, qualquer situação em que você precise armazenar e gerenciar um conjunto de elementos em ordem pode se
beneficiar do uso dessa estrutura de dados.
9. Lista Duplamente Encadeada
• Uma lista duplamente encadeada (também conhecida como "lista duplamente ligada" ou "lista duplamente encadeada") é
uma estrutura de dados na qual cada elemento, chamado de nó, contém um valor e dois ponteiros que apontam para o
próximo e o nó anterior na lista.
• Esses ponteiros permitem que a lista seja percorrida em ambas as direções - da esquerda para a direita (do primeiro ao
último nó) e da direita para a esquerda (do último ao primeiro nó).
• Em uma lista duplamente encadeada, a operação de inserção ou remoção de um elemento é mais eficiente do que em uma
lista simplesmente encadeada, pois não é necessário percorrer toda a lista a partir do início para chegar a um determinado
nó.
• Em vez disso, é possível navegar pelos ponteiros dos nós anterior e posterior para realizar essas operações.
• No entanto, a lista duplamente encadeada ocupa mais espaço em memória do que a lista simplesmente encadeada, pois
cada nó tem que armazenar dois ponteiros em vez de um.
10. Representação
• Observe que os ponteiros no nó "A" apontam
para o nó "null" à esquerda (ou seja, não há nó
anterior) e para o nó "B" à direita.
• Os ponteiros no nó "B" apontam para o nó "A"
à esquerda e o nó "C" à direita.
• Os ponteiros no nó "C" apontam para o nó "B"
à esquerda e para o nó "null" à direita (ou seja,
não há nó posterior).
11. Aplicação
• As listas duplamente encadeadas são amplamente utilizadas em programação para implementar diversas estruturas de dados,
como por exemplo:
1. Listas de reprodução de músicas ou vídeos, onde cada elemento da lista representa uma música ou vídeo e a lista
pode ser percorrida em ambas as direções para reproduzir as faixas na ordem desejada.
2. Editores de texto, onde os nós da lista representam as linhas de texto e a lista pode ser percorrida em ambas as
direções para editar ou excluir linhas de texto.
3. Navegação de páginas da web, onde os nós da lista representam as páginas visitadas e a lista pode ser percorrida em
ambas as direções para voltar ou avançar para páginas anteriormente visitadas.
4. Gerenciamento de memória em sistemas operacionais, onde a lista duplamente encadeada é usada para manter o
controle dos blocos de memória alocados e desalocados.
5. Filas de prioridade, onde cada elemento da lista possui um valor de prioridade e a lista pode ser ordenada com base
na prioridade de cada elemento.
• Esses são apenas alguns exemplos de aplicação prática de listas duplamente encadeadas, mas há muitas outras possibilidades
de uso para essa estrutura de dados flexível e versátil.
12. Lista Dinâmica Duplamente Encadeada Não
Ordenada
• Estrutura de dados em que cada elemento da lista contém dois ponteiros que apontam para o
elemento anterior e o próximo elemento na lista.
• Ao contrário de uma lista simplesmente encadeada, onde cada elemento possui apenas um
ponteiro para o próximo elemento, a lista dinâmica duplamente encadeada permite a
navegação em ambas as direções.
• Além disso, a lista dinâmica duplamente encadeada é não ordenada, o que significa que os
elementos podem estar em qualquer ordem.
• Isso permite a inserção e remoção de elementos em qualquer posição da lista de maneira
eficiente.
• Em geral, as operações básicas em uma lista dinâmica duplamente encadeada incluem a
inserção de elementos no início, no final ou em qualquer posição da lista, a remoção de
elementos da lista e a navegação pelos elementos em ambas as direções.
13. Representação
• Nesta imagem, os ponteiros NULL representam o início e o fim da
lista.
• Cada elemento da lista contém dois ponteiros: um apontando para o
elemento anterior e outro para o próximo elemento na lista.
• A seta <-> indica a direção da ligação entre os elementos.
14. Lista Dinâmica Duplamente Encadeada Ordenada
• É uma estrutura de dados em que cada elemento da lista tem um ponteiro para o
elemento anterior e outro para o elemento seguinte.
• Além disso, os elementos são armazenados em ordem crescente ou decrescente, de
acordo com algum critério de ordenação definido.
• Essa estrutura permite a inserção e remoção eficiente de elementos em qualquer posição
da lista, já que cada elemento mantém referências tanto para o elemento anterior quanto
para o seguinte.
• Além disso, a lista pode ser percorrida tanto do início para o fim quanto do fim para
o início, tornando-se útil em diversas aplicações.
• Por exemplo, uma lista dinâmica duplamente encadeada ordenada pode ser usada para
implementar um conjunto ordenado de elementos, em que a inserção, remoção e busca
de elementos podem ser realizadas de forma eficiente.
15. Representação:
• Nessa lista, cada elemento contém três campos: o ponteiro para o elemento anterior
(prev), o valor do elemento (data) e o ponteiro para o elemento seguinte (next). No
exemplo, os elementos são armazenados em ordem alfabética pelo valor do campo data,
e cada elemento mantém referências para o elemento anterior e posterior.
• O primeiro elemento da lista é o elemento A, que não tem um elemento anterior (prev =
NULL) e é seguido pelo elemento B. O último elemento da lista é o elemento H, que não
tem um elemento seguinte (next = NULL) e é precedido pelo elemento D.
• Essa estrutura de dados permite a inserção e remoção eficiente de elementos em
qualquer posição da lista, e a lista pode ser percorrida tanto do início para o fim quanto
do fim para o início.
16. Aplicação:
• Alguns exemplos de aplicação prática de lista dinâmica duplamente encadeada ordenada:
1. Gerenciamento de contatos: uma lista dinâmica duplamente encadeada ordenada pode ser usada para armazenar
contatos em ordem alfabética pelo nome ou sobrenome. Isso facilita a busca por um contato específico e permite a
inserção e remoção eficiente de contatos.
2. Sistemas de gerenciamento de arquivos: uma lista dinâmica duplamente encadeada ordenada pode ser usada para
armazenar arquivos em ordem alfabética ou de acordo com outros critérios, tornando mais fácil a busca e a navegação
pelos arquivos.
3. Implementação de conjuntos ordenados: uma lista dinâmica duplamente encadeada ordenada pode ser usada para
implementar conjuntos ordenados, em que os elementos são armazenados em ordem crescente ou decrescente. Isso
pode ser útil em algoritmos de ordenação ou em outras aplicações em que a ordem dos elementos é importante.
4. Implementação de cache LRU: uma lista dinâmica duplamente encadeada ordenada pode ser usada para implementar
um cache LRU (Least Recently Used), em que os elementos são armazenados em ordem de acesso, e o elemento menos
acessado é removido quando o cache atinge um limite de tamanho pré-definido.
• Esses são apenas alguns exemplos de aplicação prática de lista dinâmica duplamente encadeada ordenada. Essa estrutura de
dados pode ser útil em uma ampla variedade de aplicações em que a ordenação, inserção, remoção e busca eficiente de
elementos é importante.
17. Bibliografia
• Deitel, H. M., & Deitel, P. J. C: Como Programar. 6. ed. Porto Alegre. Bookman. 2011.
• Forbellone, A. L. V., & Eberspächer, H. F. Lógica de Programação: A construção de
algoritmos e estruturas de dados. 4. ed. São Paulo. Pearson Prentice Hall. 2005.
• Nívio Ziviani. Projeto de Algoritmos com Implementações em Pascal e C. 2. ed. São Paulo.
Pioneira Thomson Learning. 2004.
• Pereira, S. L. Algoritmos e Estruturas de Dados: Uma abordagem didática. 2. ed. Rio de
Janeiro. Brasport. 2009.
• Weiss, M. A. Estruturas de Dados e Seus Algoritmos. 2. ed. Rio de Janeiro. LTC. 1994.
• Ziviani, Nivio. Projeto de Algoritmos: com implementações em Pascal e C. 3. ed. São
Paulo. Cengage Learning. 2011.