Algoritmos e Estruturas de Dados
Listas Encadeadas
Prof. Me. Claudio Benossi
[email protected]
Listas Encadeadas
 Listas encadeadas ou listas ligadas
representam uma seqüência de objetos na
memória do computador.
 Exemplo: Lista de afazeres
1. Comprar uma lâmpada
2. Trocar uma lâmpada queimada
3. Procurar uma conta no quarto
4. Pagar uma conta na internet
5. Desligar o computador
6. Dormir
Listas Encadeadas
Na lista de afazeres anterior, uma tarefa
dependia da execução da tarefa anterior
Ação atual
Próxima
ação
Listas Encadeadas
1. Comprar
lâmpada
2
2. Trocar
lâmpada
3
3. Procurar
conta
4
4. Pagar
conta
5
5. Desligar
micro
6
6. Dormir
fim
Listas Encadeadas
:: Representação por vetores
Como representar a lista anterior em um
programa escrito na Linguagem C?
 Primeira opção: vetores ou matrizes
Tarefa:
Índice:
Comprar Trocar Procurar
lâmpada lâmpada conta
1
2
3
Pagar
conta
Desligar
micro
Dormir
4
5
6
Listas Encadeadas
:: Representação por vetores
Primeira opção: vetores ou matrizes
 Como acrescentar “Ligar micro”?
Tarefa:
Índice:
Comprar Trocar Procurar
lâmpada lâmpada conta
1
2
3
Pagar
Ligar
conta
micro
4
Desligar
micro
5
Dormir
6
7
Listas Encadeadas
:: Representação por vetores
Primeira opção: vetores ou matrizes
 Os itens da lista são armazenados em posições
contíguas de memória.
 A lista pode ser percorrida em qualquer direção.
 A inserção de um novo item pode ser realizada após
o último item com custo constante.
 A inserção de um novo item no meio da lista requer
um deslocamento de todos os itens localizados após
o ponto de inserção.
 Retirar um item do início da lista requer um
deslocamento de itens para preencher o espaço
deixado vazio.
Listas Encadeadas
:: Representação por ponteiros
Segunda opção: ponteiros
 Estruturas de dados dinâmicas: estruturas de dados
que contém ponteiros para si próprias.
struct lista {
char nome_tarefa[30];
float duracao;
char responsavel[30];
...
struct lista *prox;
};
ponteiro para a
própria estrutura lista
Listas Encadeadas
:: Representação por ponteiros
Representação gráfica de um elemento da lista:
campos de informação
próximo nó
 Cada item é encadeado com o seguinte, mediante
uma variável do tipo ponteiro.
 Permite utilizar posições não contíguas de memória.
 É possível inserir e retirar elementos sem
necessidade de deslocar os itens seguintes da lista.
Listas Encadeadas
:: Representação por ponteiros
 Cada item em particular de uma lista pode ser chamado
de elemento, nó, célula, ou item.
 O apontador para o início da lista também é tratado
como se fosse uma célula (cabeça), para simplificar as
operações sobre a lista.
 O símbolo / representa o ponteiro nulo (NULL),
indicando o fim da lista.
p
3
5
2
4
/
162
Operações sobre lista encadeada
Podemos realizar algumas operações sobre uma
lista encadeadas, tais como:
 Inserir itens;
 Retirar itens;
 Buscar itens.
Para manter a lista ordenada, após realizar
alguma dessas operações, será necessário
apenas movimentar alguns ponteiros (de um a
três elementos).
Operações sobre lista encadeada
Outras operações possíveis:
 Criar uma lista
 Destruir uma lista
 Ordenar uma lista
 Intercalar duas listas
 Concatenar duas listas
 Dividir uma lista em duas
 Copiar uma lista em outra
Operações sobre lista encadeada
:: Inserção de itens
Podemos inserir itens:
 No começo de uma lista
 No final de uma lista
 No meio de uma lista
Operações sobre lista encadeada
:: Inserção de itens no início
O endereço armazenado no ponteiro p deve ser
alterado para o endereço do item a ser
acrescido à lista.
p
5
2
4
/
3
163
Operações sobre lista encadeada
:: Inserção de itens no final
O endereço armazenado em p será alterado
caso a lista esteja vazia ou
O campo prox do último item será alterado.
/
p
3
p
3
/
5
/
164
Operações sobre lista encadeada
:: Inserção de itens no meio
Campo prox do item a ser inserido recebe o
campo prox do item posterior
Campo prox do item antecessor recebe o
endereço do item a ser inserido
p
3
2
4
/
5
lista[5].prox ← lista[2]
lista[3].prox ← 5
165
Operações sobre lista encadeada
:: Remoção de itens no início
O endereço armazenado no ponteiro p deve ser
alterado para o endereço do item que segue o
primeiro item da lista.
p
5
2
4
/
166
Operações sobre lista encadeada
:: Remoção de itens no final
O campo prox do último item será alterado
caso a lista contenha mais de um item ou
O endereço armazenado em p será alterado
para NULL.
p
3
p
3
/
5
/
/
167
Operações sobre lista encadeada
:: Remoção de itens no meio
Item antecessor recebe o campo prox do item
a ser removido
lista[3].prox ← lista[5].prox
p
3
5
2
4
/
168
Um outro exemplo
O programa abaixo...
169
Outros tipos de Listas Encadeadas
 Existem ainda outras variações de lista encadeada,
dentre elas:
 Listas Duplamente Encadeadas
 Listas Circulares
Listas Duplamente Encadeadas
Cada elemento da lista é ligado a seu sucessor e
a seu predecessor.
Possibilita um trajeto em ambos os sentidos,
simplificando o gerenciamento da lista.
Listas Duplamente Encadeadas
A estrutura de dados de um nó de uma lista
duplamente encadeada recebe um novo campo:
um ponteiro para o nó antecessor.
typedef struct
int
struct noh
struct noh
} tipoNode;
noh {
info;
*ant;
*prox;
170
Listas Circulares
São listas encadeadas cujo fim aponta para o
seu início, formando um círculo que permite
uma trajetória contínua na lista. Podem ser:
 Singularmente encadeadas
 Duplamente encadeadas
Listas Circulares
A estrutura de um nó de uma lista circular
permanece a mesma. Dependerá apenas se o
encadeamento da lista é duplo ou singular.
O que modifica é que não há mais necessidade
de dois ponteiros para indicar o início e o fim da
lista.
Basta marcar um nó da lista para evitar loops.
171
Questões
Download

ICC - Prof. Ms. Claudio Benossi