aula2 listasestaticas estrutura de dados fasa
DESCRIPTION
Pilhas, listas e filasTRANSCRIPT
Estrutura de Dados
Prof. Rafael A. G. Lima
Listas Usando Arranjos
Conteúdo:
Prof. Rafael A. G. Lima
Listas Utilizando Arranjos
Listas estáticas – Contígua
Listas estáticas – Encadeadas
Simplesmente Encadeada
Duplamente Encadeada
Circular Simples
Circular Duplamente Encadeada
Listas Estáticas - Contígua
Prof. Rafael A. G. Lima
Dentre as várias operações comuns de um TAD (não só de uma lista), podemos citar as seguintes como sendo as principais:
Inicialização;
Inserção de um elemento;
Remoção de um elemento;
Localização de um elemento.
Listas estáticas são tipicamente implementadas através de arranjos.
Em uma lista estática contígua, o sucessor de um elemento ocupa posição física subsequente.
Então, o arranjo associa o elemento a(i) com índice i (mapeamento sequencial).
Listas Estáticas - Contígua
Prof. Rafael A. G. Lima
Características de lista estática contígua
Elementos armazenados fisicamente em posições
consecutivas;
A inserção de um elemento na posição i causa o
deslocamento para a direito do elemento a(i) ao último;
A eliminação do elemento a(i) requer o deslocamento
para a esquerda do a(i+1) ao último.
Listas Estáticas - Contígua
Prof. Rafael A. G. Lima
As propriedades estruturadas da lista contígua estática permitem então as seguintes operações:
Qual é o primeiro elemento da lista?
Qual é o último elemento da lista?
Quais elementos sucedem um determinado elemento?
Quantos elementos existem na lista?
Inserir um elemento na lista.
Eliminar um elemento da lista.
Localizar um elemento na lista.
Consequência: As quatro primeiras operações são feitas emtempo constante. Mas, as operações de inserção, remoção elocalização requerem mais atenção.
Listas Estáticas - Contígua
Prof. Rafael A. G. Lima
Vantagem:
Acesso direto indexado a qualquer elemento da lista.
Desvantagem:
Movimentação quando um elemento é eliminado/inserido;
Tamanho máximo pré-estimado (esta é uma desvantagem dequalquer lista estática, na verdade).
Quando usar:
Listas pequenas;
Tamanho máximo bem definido;
Inserção/remoção no fim da lista.
Listas Estáticas - Contígua
Prof. Rafael A. G. Lima
Mostraremos um código parcialmente completo das listas
estáticas (contígua).
Para fins didáticos, descreveremos a estrutura de dados
para inteiros, mas, obviamente, a estrutura ensinada pode
ser empregada para qualquer tipo de dado válido.
Listas Estáticas - Contígua
Prof. Rafael A. G. Lima
Faça as funções: tamanho, localiza:
Além destas, faça também uma função que receba duas
listas e concatene os elementos da segunda ao final da
primeira.
Listas Estáticas - Encadeadas
Prof. Rafael A. G. Lima
Para acabar com o problema do deslocamentos dos
elementos, propomos o uso de listas encadeadas. Neste
tipo de lista, a ordem física dos elementos da lista não
necessariamente corresponde à ordem lógica que se quer
representar.
Na implementação é necessário armazenar
separadamente a informação que mostra a posição de um
dos elementos da lista, normalmente o primeiro.
Listas Estáticas - Encadeadas
Prof. Rafael A. G. Lima
A principal vantagem de listas encadeadas é portanto a
eliminação do problema de deslocar elementos.
As principais desvantagens são:
Não se consegue acessar os elementos da lista em tempo
constante;
Mais operações para manter a integridade dos dados.
Listas Estáticas - Encadeadas
Prof. Rafael A. G. Lima
Podemos dividir as listas encadeadas em:
Simplesmente encadeadas;
Duplamente encadeada;
Circular simples;
Circular duplamente encadeada;
No caso de listas não circulares, as operações de inclusão
e remoção devem considerar alguns casos especiais que
são a inclusão e remoção no começo e final da lista.
Lista Simplesmente Encadeada
Prof. Rafael A. G. Lima
Em uma lista simplesmente encadeada, cada elemento
possui apenas a informação de que é seu sucessor.
Principal problema: impossibilidade de voltar ao elemento
anterior.
Lista Simplesmente Encadeada
Prof. Rafael A. G. Lima
Para implementar a lista simplesmente encadeada estática, cadaposição do arranjo possuirá o elemento e o “apontador” parao próximo elemento.
Este “apontador” será o índice no arranjo onde se encontra opróximo elemento da lista.
Será necessário também armazenar o índice do primeiroelemento.
Por fim, precisaremos representar neste mesmo arranjo umalista de posições vazias para sabermos onde inserir umelemento.
Lista Simplesmente Encadeada
Prof. Rafael A. G. Lima
Veja o exemplo abaixo de uma lista de caracteres com os
seguintes elementos, L={‘A’,‘B’, ‘C’, ‘D’, ‘E’).
Lista Simplesmente Encadeada
Prof. Rafael A. G. Lima
Mostraremos um código completo parcialmente das listas
estáticas simplesmente encadeada.
Exercício
Prof. Rafael A. G. Lima
// Remove o elemento “apontado” por p
// Retorna -1 em caso de erro e 0 se sucesso
// Não esqueça de cuidar da lista de posições vaizas
int remove(Lista *l, int p)
// Localiza um elemento na lista
// Retorna o índice do vetor onde o elemento se encontra ou
-1 caso o elemento não esteja na lista
int localiza(const Lista *l, int e)
Lista Duplamente Encadeada
Prof. Rafael A. G. Lima
Nas listas simplesmente encadeadas guardamos apenas oindicador do próximo elemento.
Mas em alguns caso é preciso obter o elemento anterior pararealizar algumas operações como por exemplo a funçãoremove. Nesta função, para obter o elemento anterior a quemqueremos remover, temos que percorrer a lista desde aprimeira posição.
Para evitar esta busca, introduziremos um indicador para oelemento anterior, diminuindo a complexidade computacional.
Outra utilidade das listas duplamente encadeadas é quepodemos percorrê-las nos dois sentidos facilmente.
Lista Duplamente Encadeada
Prof. Rafael A. G. Lima
Para entender a versão estática, veja um exemplo abaixo
de uma lista de caracteres com os seguintes elementos,
L=={‘A’,‘B’, ‘C’, ‘D’, ‘E’).
Exercício
Prof. Rafael A. G. Lima
Baseie-se no exemplo anterior para implementar uma
lista duplamente encadeada estática, incluindo também
todas as operações fundamentais já mostradas.
Listas Circulares
Prof. Rafael A. G. Lima
Uma lista circular pode ser simples ou duplamente
encadeada.
O que caracteriza as listas circulares é o fato do sucessor
do último elemento ser o primeiro da lista.
Listas Circulares
Prof. Rafael A. G. Lima
A principal vantagem de listas circulares é que não
precisamos considerar casos especiais de inclusão e
remoção de elementos (primeiro e último). A não ser, é
claro, o cuidado com a integridade do indicador primeiro.
Exercício
Prof. Rafael A. G. Lima
Implemente uma lista circular duplamente encadeada
estática, incluindo todas as operações fundamentais já
mostradas.