Aula 5 - Frederico Brito Fernandes

Download Report

Transcript Aula 5 - Frederico Brito Fernandes

Listas Encadeadas
Prof. Frederico Brito Fernandes
[email protected]
CONTEÚDO
(1) Motivação
(2) Definição
(3) Operações
(4) Comparando Vetores e Listas Ligadas
(5) Lista Circular
(6) Lista Duplamente Encadeada
(1) Motivação
Motivação...
• Prever o número máximo de elementos no vetor
durante a codificação
– dimensionar o vetor com um número absurdamente alto
• isto levaria a um desperdício de memória que é inaceitável
em diversas aplicações
RESERVAS AÉREAS
nome
nome
nome
nome
e-ticket
e-ticket
e-ticket
e-ticket
1
2
0
3
...
nome
e-ticket
699
• E se tivermos mais de 700 reservas simultâneas?
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
2
(1) Motivação
Solução
• Algumas aplicações requerem a inserção/deleção
constantes de elementos
• Solução:
– Usar listas ligadas
Dado 
Dado 
Dado 
Dado /
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
3
(2) Definição
Listas
• Uma lista é uma estrutura de dados dinâmica.
• O número de nós de uma lista pode variar
consideravelmente à medida que elementos são
inseridos ou removidos.
• A natureza dinâmica de uma lista pode ser comparada à
natureza estática de um vetor, cujo tamanho permanece
constante.
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
4
(2) Definição
Lista Simplesmente Encadeada
• É uma estrutura de dados
concreta que consiste de
uma seqüência de nós
• Cada nó armazena
dado
nó
– O conteúdo do elemento
– Uma ligação para o próximo nó
A
Estrutura, Pesquisa e Ordenação de Dados
B
próximo
C
Frederico Brito Fernandes
D

5
(2) Definição
O tipo Nó
• Possui os campos de informação
• Possui um campo de ligação com o próximo elemento
do tipo Nó
• As operações sobre nó são:
–
–
–
–
Atualiza informação
Atualiza próximo
Recupera informação
Recupera próximo
Estrutura, Pesquisa e Ordenação de Dados
dado
Frederico Brito Fernandes
próximo
nó
6
(2) Definição
Exemplo: Reserva Aérea
• Ex:
main(){
tReserva *cabeca, *segundoNo, *terceiroNo;
cabeca = (tReserva *) malloc(sizeof(tReserva));
cabeca->prox = NULL;
#include <stdlib.h>
#include <stdio.h>
typedef struct eReserva {
char nome[60];
char e_ticket[20];
struct eReserva *prox;
} tReserva;
segundoNo = (tReserva *) malloc(sizeof(tReserva));
cabeca->prox = segundoNo;
segundoNo->prox = NULL;
struct eReserva
nome
e-ticket
terceiroNo = (tReserva *) malloc(sizeof(tReserva));
segundoNo->prox = aux;
terceiroNo->prox = NULL;
NULL
}
tReserva
cabeca
segundoNo
nome
e-ticket
Estrutura, Pesquisa e Ordenação de Dados
prox
nome
terceiroNo
e-ticket
Frederico Brito Fernandes
prox
nome
e-ticket
NULL
7
(2) Definição
O tipo Lista Encadeada
• Possui um campo que referencia o início da lista (também
chamado de cabeça da lista)
• Possui um campo que representa o número total de nós da lista.
• As operações sobre lista encadeada são:
–
–
–
–
–
–
Inserir nó no início
Inserir nó no fim
Inserir nó no meio
Remover nó no início
Remover nó no fim
Remover nó no meio
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
8
(3) Operações
Inserir nó no início da lista
1. Aloque um novo nó
2. Faça o campo
próximo do novo nó
apontar para o nó
cabeça da lista
3. Atualize o campo que
aponta para a cabeça
para apontar para o
novo nó
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
9
(3) Operações
Inserir um nó no fim da lista
1. Localize a cauda da lista
2. Aloque um novo nó
3. Faça o campo próximo do
novo nó apontar para null
4. Faça o campo próximo do
nó cauda apontar para o
novo nó
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
10
(3) Operações
Inserir um nó no meio da lista
1. Use uma variável auxiliar do tipo Nó para localizar o nó “V”
após o qual se deseja inserir o novo nó
2. Aloque um novo nó
3. Faça o campo próximo do novo nó apontar para o nó apontado
pelo campo próximo do nó “V”
4. Faça o campo próximo do nó “V” apontar para o novo nó
V
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
11
(3) Operações
Remover um nó da cabeça da lista
1. Use uma variável auxiliar
do tipo Nó para apontar
para a cabeça da lista
2. Atualize o campo que
aponta para a cabeça da
lista para apontar para o
próximo nó na lista
3. Desaloque o nó da
variável auxiliar.
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
12
(3) Operações
Remover um nó da cauda da lista
1.
2.
3.
4.
Use uma variável auxiliar do tipo Nó para localizar o penúltimo
nó da lista
Use uma outra variável auxiliar do tipo Nó para apontar para a
cauda da lista
Coloque o campo próximo do penúltimo nó da lista para null
Desaloque o último nó
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
13
(3) Operações
Remover um nó do meio da lista
1. Use uma variável auxiliar do tipo Nó para localizar o nó anterior
“V” ao nó a ser removido da lista
2. Use uma outra variável auxiliar do tipo Nó para apontar para o
nó “W” a ser removido da lista
3. Faça o campo próximo do nó “V” apontar para o nó apontado
pelo campo próximo do nó a ser removido da lista
4. Desaloque o nó “W”
V
Estrutura, Pesquisa e Ordenação de Dados
W
Frederico Brito Fernandes
14
(4) Comparando vetores e listas ligadas
Forma de acesso
• Um item é acessado numa lista encadeada, percorrendo-se a lista a partir do
início, porque não existe relação entre a posição de memória ocupada por um
elemento de uma lista e sua posição dentro dessa lista.
• Um item é acessado num vetor através de uma única operação (usando o
índice)
Dado
Dado
Dado
Dado
0
1
2
3
Dado 
Dado 
Dado 
Dado /
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
15
(4) Comparando vetores e listas ligadas
Flexibilidade
• Por outro lado o vetor não é uma estrutura de dados
muito flexível
– É preciso dimensioná-lo com um número máximo de
elementos
– Se o número de elementos que precisarmos armazenar exceder
a dimensão do vetor, teremos um problema
– Se o número de elementos que precisarmos armazenar no
vetor for muito inferior à sua dimensão, estaremos
subutilizando o espaço de memória reservado
– Se precisarmos retirar ou inserir um elemento no meio do
vetor, teremos de deslocar alguns elementos do vetor
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
16
(5) Lista Circular
Lista Circular
• O campo próximo do último nó aponta de volta para o primeiro
nó, em vez de apontar para null.
• Não tem um "primeiro" ou um "último" nó natural. É preciso
estabelecer um primeiro e um último nó por convenção.
– Uma variável auxiliar do tipo Nó aponta para o último nó e o nó seguinte
se torna o primeiro nó
– Se a variável auxiliar do tipo Nó apontar para null então a lista circular está
vazia
Dado 
Dado 
Dado 
Dado 
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
17
(5) Lista Circular
Lista Circular - Limitações
• Não se pode atravessar uma lista desse tipo no sentido
contrário
• Para eliminar um nó de uma lista circularmente ligada, é
preciso usar pelo menos uma variável auxiliar do tipo
Nó
– A solução é usar Lista Duplamente Encadeada
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
18
(6) Lista Duplamente Encadeada
Lista Duplamente Encadeada
• O encadeamento simples também dificulta a retirada de
um elemento da lista
– Temos que percorrer a lista, elemento por elemento, para
encontrarmos o elemento anterior àquele que queremos
eliminar.
• A solução é usar uma lista duplamente encadeada
 Dado 
 Dado 
 Dado 
 Dado 
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
19
(6) Lista Duplamente Encadeada
Lista Duplamente Encadeada
ant
• Cada nó armazena :
– O conteúdo do elemento
– A ligação para o próximo nó
– A ligação para o nó anterior
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
prox
dado
nó
20
(6) Lista Duplamente Encadeada
Inserir novo elemento na lista
p
A
B
C
p
A
B
C
X
p
A
Estrutura, Pesquisa e Ordenação de Dados
B
Frederico Brito Fernandes
q
q
X
C
21
(6) Lista Duplamente Encadeada
Remover elemento na lista
p
A
B
C
A
B
C
D
p
E
E
D
A
Estrutura, Pesquisa e Ordenação de Dados
B
C
Frederico Brito Fernandes
E
22
(6) Lista Duplamente Encadeada
Exercício
• Escreva o pseudo-código para as operações de
inserir e remover um elemento em lista
duplamente encadeada
Estrutura, Pesquisa e Ordenação de Dados
Frederico Brito Fernandes
23