Estrutura de Dados I
Humberto Rocha
Aula 03:Listas
Slides originais dos professores Yuri Morais Bezerra, Filipe Teixeira Marques e Sandra Puga
Listas
Uma lista é uma coleção de elementos do mesmo tipo dispostos linearmente que podem ou não seguir uma determinada organização.
Por exemplo: [E1, E2, E3, E4, E5, ..., En], onde n deve ser > = 0. Lista de Pagamentos: • Prestação do carro; • Cartão de crédito; • Conta de luz; • Condomínio;
Listas
“Estrutura dinâmica/estática caracterizada por uma sequência ordenada de elementos”. (VILLAS et al, 1993)
Composta por Nós
Exemplos: Lista Telefônica, lista de clientes de uma agência bancária, lista de setores, etc.
4
Listas
Propriedades
Existem n elementos na sequência;
E1 é o primeiro elemento da sequência; En é o último elemento da sequência;
Para todo i, j entre 1 e n, se i<j, então o
5
Listas
Operações realizadas com listas
Criar uma lista vazia;
Verificar se uma lista está vazia; Obter o tamanho de uma lista;
Obter/modificar o valor do elemento em uma
6
Listas
Operações realizadas com listas (cont.)
Obter a posição do elemento cujo valor é
dado;
Inserir um novo elemento após (antes) de uma
determinada posição na lista;
Remover um elemento em uma determinada
posição.
Exibir os elementos de uma lista; Concatenar duas listas.
Formas de Representação de listas Sequencial Encadeada
Listas
casa carro cama mesa L Lista Sequencial
Explora a sequencialidade da memória do
computador.
Utiliza estruturas estáticas
9
Lista Sequencial
Lista armazenada em memória na forma sequencial.
A implementação de operações pode ser feita utilizando array, associando o elemento a(i) com o índice i
Cap. 10 - 10
Lista Sequencial
Quando criamos uma lista para utilizá-la como uma estrutura de dados, pode-se utilizar como contêiner para o armazenamento dos dados um vetor ou uma matriz ;
Lista de pagamentos: prestação do carro, cartão de crédito, conta de luz, condomínio, TV a cabo, prestação do crediário.
11
Lista Sequencial
Características
Elementos são armazenados fisicamente em
posições consecutivas
A inserção de um elemento na posição a(i)
causa o deslocamento a direita do elemento a(i) ao último
A remoção do elemento a(i) requer o
deslocamento à esquerda do elemento a(i+1) ao último
12
Lista Sequencial
O que devemos saber sobre as listas?
Se está vazia Se está cheia
Número de elementos existentes
Qual elemento ocupa uma determinada
posição
Como inserir e remover elementos;
Como realizar busca e percorrer seus
13
Lista Sequencial
Desvantagens:
Não aloca memória de forma eficiente
Tamanho máximo pré-estimado
Não disponibiliza flexibilidade de manutenção
Movimentação quando um elemento é inserido ou removido
Memória ocupada mesmo quando a lista está
14
Lista Sequencial
Vantagens
Acesso direto indexado a qualquer elemento
da lista;
Tempo constante para acessar o elemento i
(depende apenas do índice).
Quando usar?
Principalmente quando o tamanho máximo é
Sequencia de elementos encadeados por
referências
Utiliza estruturas dinâmicas
Lista Encadeada
casa carro cama mesa L
Lista Encadeada
Quando usamos a alocação dinâmica: precisamos referenciar os elementos seguinte e anterior de cada elemento da lista.
O elemento 1 aponta para o elemento 2, o elemento 2 aponta para o elemento 3 e assim por diante:
E1 E2 E3 En
casa carro cama mesa L
Lista Encadeada
Elementos da estrutura não ocupam
necessariamente espaços sequenciais na memória;
Tipo de lista em que a sequencia de elementos
são encadeados por referências
Possuem referências que guardam o endereço do
registro sucessor (próximo elemento);
Elementos são alocados dinamicamente;
casa carro cama mesa
Desvantagens
Na estrutura encadeada, a ligação entre os nós utiliza
mais espaço, visto que um novo campo foi incluído (campo prox)
Este fato não representa necessariamente mais memória utilizada
O espaço destinado para a informação pode ser melhor aproveitado (tamanho da lista não é fixo)
Lista Encadeada
x y z
a x y z
Vantagens
O uso das referências dá flexibilidade à estrutura nas
inserções e retiradas de elementos
Não é mais necessário realizar movimentações dos elementos da lista (inserção/remoção)
Lista Encadeada
x y z
a x y z
Quando usar?
Principalmente quando o tamanho máximo NÃO
é bem definido.
Outras características
Algoritmos mais complexos;
O último nó de cada lista deverá apontar para NULL; Sinalização do final da lista.
Para acessar um nó qualquer, é necessário percorrer
os elementos da lista
Na sequencial, isto é feito de forma direta
Melhor aproveitamento de memória
Espaço para o nó não é alocado previamente
Alocação pode ser feita com a memória
fragmentada
Lista Sequencial
Explora a sequencialidade da memória do
computador.
Utiliza estruturas estáticas
Lista Encadeada
Sequência de elementos encadeados por
ponteiros
Utiliza estruturas dinâmicas
23
Sequencial
Fica armazenada em memória de forma
sequencial
No momento da criação, todo o espaço é
reservado
Mesmo quando ainda não está sendo utilizado
Encadeada
Não reserva memória previamente
O local de memória é alocado para o novo
elemento no momento da inserção
Ou seja, ela pode crescer indefinidamente
Até onde a memória do computador suportar
24
Lista Simplesmente Encadeada
Tipo de lista encadeada em que cada elemento possui
apenas uma ligação;
25
Lista Simplesmente Encadeada
Operações sobre listas:
Definição da estrutura de dados; Criação da lista vazia;
Verificação de lista vazia;
Obtenção do tamanho da lista;
Obter o valor de uma determinada posição;
Obter a posição do elemento cujo valor é dado; Inserir um elemento na lista, dada sua posição;
Remover um elemento de uma determinada
Lista Simplesmente Encadeada
Algoritmo ExemploListaSimples
// Referências para os nós simples
Tipo apontador: ^NoSimples
// Registro que monta a estrutura para os nós
NoSimples = registro valor: inteiro
prox: apontador fim
// Registro que monta a estrutura para a lista
ListaSimples = registro primeiro: apontador ultimo: apontador fim
inicio
// Criando uma lista inicialmente vazia
ListaSimples.primeiro nulo ListaSimples.ultimo nulo
Cap. 10 - 27
Lista Simplesmente Encadeada
Cap. 10 - 28
Listas Simplesmente Encadeadas
Procedimento InsereNo_fim (var novoNo: NoSimples) Inicio
// O último nó da lista deve ter o prox como nulo
novoNo^.prox nulo
// Se a lista estiver vazia
Se (ListaSimples.primeiro = nulo) Então ListaSimples.primeiro novoNo
Fim-Se
// Se a lista não estiver vazia
Se (ListaSimples.ultimo <> nulo) Então ListaSimples.ultimo^.prox novoNo Fim-Se
// Independe se a lista está vazia ou não
ListaSimples.ultimo novoNo Fim
29
Exercícios
1. Defina Listas Sequenciais e apresente suas principais características.
2. Defina Listas Encadeadas e apresente suas principais características.
3. Pesquise um exemplo prático de situação onde poderiam ser utilizadas Listas Sequenciais.
4. Descreva um algoritmo demonstrando a situação pesquisada.
5. Descreva um procedimento em algoritmo para cada uma das operações que podem ser trabalhadas com Listas Sequenciais. Comente o algorimo linha a linha.
6. Pesquise um exemplo prático de situação onde poderiam ser utilizadas Listas Encadeadas.
7. Descreva um algoritmo demonstrando a situação pesquisada.
8. Descreva um procedimento em algoritmo para cada uma das operações que podem ser trabalhadas com Listas Encadeadas. Comente o algorimo linha a linha.
30
Referências
• SANDRA PUGA & GERSON RISSETTI. Lógica de
Programação e Estrutura de Dados. Prentice-Hall, 2004.
• PREISS, Bruno. Estruturas de Dados e Algoritmos:
Padrões de projetos orientados a objetos com Java.
Campus, 2001.
• VELOSO. P. Estrutura de dados. Campus, 1995.
• HOROWITZ, E. Fundamentos de Estruturas de Dados. Campus, 1987.