0% acharam este documento útil (0 voto)
12 visualizações14 páginas

Aula03 Lista Encadeada

O documento aborda o conceito de listas encadeadas, destacando suas características, operações e implementações em C e C++. As listas encadeadas permitem inserções e remoções eficientes, mas o acesso é sequencial, ao contrário das listas sequenciais que permitem acesso aleatório. O texto também menciona variações como listas duplamente encadeadas e circulares.

Enviado por

nargasdosexo555
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
12 visualizações14 páginas

Aula03 Lista Encadeada

O documento aborda o conceito de listas encadeadas, destacando suas características, operações e implementações em C e C++. As listas encadeadas permitem inserções e remoções eficientes, mas o acesso é sequencial, ao contrário das listas sequenciais que permitem acesso aleatório. O texto também menciona variações como listas duplamente encadeadas e circulares.

Enviado por

nargasdosexo555
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 14

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

Você também pode gostar