Lista Encadeada
Aula 03
Marcos Silvano Almeida
[email protected]Departamento de Computação
UTFPR Campo Mourão
Lista Encadeada
● Encadeamento de nós (Nodes) que armazenam os dados
○ Acesso somente sequencial
○ Não permite acesso aleatório aos seus elementos.
■ Posições/Índices podem ser simulados, mas acesso continua sequencial
○ Bom para para inserções/remoções em qualquer posição da lista
○ Disponível em C++ pela STL como std::forward_list
■ std::List é a Lista Duplamente Encadeada
○ Operações: criar, destruir, inserir, acessar, pesquisar, remover, imprimir, ...
● É estruturada como um encadeamento de Nodes
head 3 8 2 5
O tipo Lista Encadeada e seus Nodes (C/C++)
struct LinkedList {
Node* head; // aponta para o primeiro elemento
};
struct Node {
int key; // identificador do elemento
Node* next; // aponta para o próximo elemento (encadeamento)
};
head 3 8 2 5
elem next
O tipo Lista Encadeada e seus Nodes (C++)
● A manipulação da Lista Encadeada ocorre por meio das operações (funções)
// Utilizando Lista Encadeada em C++
LinkedList* list1 = new LinkedList(); // head -> NULL
list1->push_front (5); // head -> [5]
list1->push_front (9); // head -> [9] -> [5]
list1->push_front (15); // head -> [15] -> [9] -> [5]
list1->print(); // head -> [15] -> [9] -> [5]
list1->pop_front (); // head -> [9] -> [5]
O tipo Lista Encadeada e seus Nodes (C vs C++)
● A manipulação da Lista Encadeada ocorre por meio das operações (funções)
// Utilizando Lista Encadeada em C++ // Utilizando Lista Encadeada em C
LinkedList* list1 = new LinkedList(); LinkedList* list1 = list_create ();
list1->push_front (5); list_push_front (list1, 5);
list1->push_front (9); list_push_front (list1, 9);
list1->push_front (15); list_push_front (list1, 15);
list1->print(); list_print (list1);
list1->pop_front (); list_pop_front (list1); …
Lista Sequencial vs Encadeada
Lista Sequencial Lista Encadeada
✅Acesso sequencial ✅Acesso sequencial
✅Acesso aleatório ⛔Acesso aleatório
⛔Redimensionamento custoso ✅Fácil redimensionamento
⛔Inserções/Remoções no início ✅Inserções/Remoções no início
✅Inserções/Remoções no final ✅Inserções/Remoções no final (se tiver endereço)
⛔Inserções/Remoções no meio ✅Inserções/Remoções no meio (se tiver endereço)
head 3 8 2 5
capacity: 10
size: 6
data 5 9 15 4 56 78
Operações Básicas sobre a Lista Encadeada
Classe Lista Encadeada (C++)
#pragma once #include "linkedlist.h"
class Node { #include <cstdio>
public: LinkedList::LinkedList(){
//...
int key;
}
Node* next;
LinkedList::~LinkedList(){
};
//...
class LinkedList { }
private: bool LinkedList::push_front(int key){
//...
Node* head;
}
public:
bool LinkedList::pop_front(){
LinkedList();
//...
~LinkedList();
}
bool push_front(int key); int LinkedList::get(int pos){
bool pop_front(); //...
int get(int pos); }
void print(); void LinkedList::print(){
}; //...
}
Operações Básicas da Lista https://visualgo.net/en/list
LinkedList (); // Construtor: prepara lista.
~LinkedList (); // Destrutor: libera cada um dos Nodes.
void print(); // Imprime o conteúdo da lista.
int size(); // Retorna o tamanho da lista.
bool empty(); // Informa se lista vazia.
bool full(); // Informa se lista cheia.
void push_front (int key); // Insere elemento no início da lista.
bool pop_front (); // Remove elemento do início da lista.
Dica: geralmente é mais
// Insere e remove elemento no final (último elemento) fácil começar a pensar no
void push_back (int Key); processo pelo “caso médio”
e, depois, adicionar as
bool pop_back(); exceções.
Operações Básicas da Lista https://visualgo.net/en/list
Node* find(int key); // Encontra Node pela chave (ou NULL)
Node* get(int pos); // Encontra Node por posição (ou
NULL)
// Operações baseadas em Nodes
bool insert_after (int key, Noden* pos); // Insere novo Node após o
// Node informado
bool remove_after (int key, Noden* pos); // Remove o Node imediatamente após o
// Node informado
// Operações baseadas em posições ou valores
bool insert(int pos); // Insere elemento na posição informada
bool remove(int pos); // Remove elemento na posição informada
bool remove(int key); // Remove elemento de valor informado
bool insert_sorted (int key); // Insere elemento em ordem crescente.
Estratégias de Implementação de Lista Encadeada
Estratégias de implementação de Lista Encadeada
● Adicionar ponteiro para cauda da lista
○ Torna bastante eficiente as inserções ao final da lista
○ Acarreta em mais código de controle, especialmente nas operações de
modificação da lista (inserir e remover).
Lista com
Lista vazia
um Node
struct LinkedList {
Node* head; // primeiro Node head tail
head tail
Node* tail; // último Node
}; NULL 5
struct Node {
int key; head tail
Node* next;
}; 3 8 2 5
Lista habitual
Estratégias de implementação de Lista Encadeada
● Emprego de sentinela
○ Elemento "coringa" como primeiro da lista
Lista vazia
head *
○ Simplifica a implementação, pois "head" nunca precisa ser atualizado
■ Na implementação tradicional, as operações de modificação da lista (inserir e remover)
requerem verificações para atualizar o ponteiro "head". Com o emprego do elemento
sentinela, não há necessidade de atualizar "head", simplificando a implementação.
head * 8 Lista com
um Node
Lista habitual
head * 8 2 5
Variações do TAD Lista Encadeada
● Lista Duplamente Encadeada
○ Cada Node possui dois ponteiros, prev e next, que apontam, respectivamente, ao
Node anterior e ao próximo, na lista.
head Lista Duplamente
8 2 5 encadeada
Lista Duplamente
head encadeada com
* 8 2 5
Sentinela
● Lista Circular
○ Simples ou Duplamente Encadeada
Lista Encadeada
head 8 2 5 Circular