Você está na página 1de 37

Universidade Federal de Alagoas (UFAL)

Campus Arapiraca

Estruturas de Dados (ED)


07 - Listas

Alexandre de Andrade Barbosa


alexandre.barbosa@arapiraca.ufal.br

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 1/ 37


Lista
Exercı́cios, Resumo e Referências

Objetivos

Objetivos
Apresentar a estrutura de dados Lista
Exibir os diferentes tipos de lista
Implementar os diferentes tipos de lista

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 2/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada

Uma lista é uma estrutura de dados de tamanho variável que


pode armazenar elementos de um mesmo tipo
Listas também são conhecidas como lista ligada, lista ligada
linear, lista encadeada ou lista simplesmente encadeada
Cada elemento da lista (nó) possui uma referência (endereço)
para o próximo elemento
Exemplo:

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 3/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada

Uma lista é formada por um conjunto de nós


Um nó é um elemento que possui:
Uma área de dados
Uma referência para o próximo elemento
Exemplo:

string nome
string fone
int idade
proximo →

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 4/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada

Um nó vazio é representado pela palavra null


Null pode ser representado por um dos sı́mbolos
Exemplo:

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 5/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Não é possı́vel acessar diretamente um elemento da lista, pois os
espaços alocados não são contı́nuos
Exemplo: Lista

Localização na memória

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 6/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Operações

Operações:
Criar lista vazia;
Verificar se a lista está vazia;
Inserir;
Pesquisar;
Remover;
Destruir a lista.

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 7/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Operações - Criar e Verificar

Criar lista vazia:


O elemento inicial da lista deve ser null.
Verificar se a lista está vazia:
Basta checar se o primeiro elemento corresponde a null

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 8/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Operações - Inserir

Exemplo: Inserir(L, ’A’) Inserir*:


1 Cria-se um nó vazio;
2 Insere os dados no nó;
3 Ponteiro do novo nó recebe
endereço do inı́cio da lista;
4 Atualiza o inı́cio da lista para
o novo nó.
*A inserção realizada no inı́cio da lista

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 9/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Operações - Pesquisar

Exemplo: Pesquisar(L, ’D’) Pesquisar:


1 Nó temporário (P = temp)
aponta para o primeiro
elemento
2 Checa se o elemento
procurado corresponde ao
atual ou se é nulo
Elemento encontrado ou
nulo → pesquisa acabou;
Senão atualiza nó
temporário e volta para
instrução 2

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 10/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Operações - Remover

Exemplo: Remover(L, ’D’) Remover:


1 São criados dois nós
temporários, (P = current) nó
atual e (N = previous) nó
anterior
2 Pesquisa elemento que será
removido, elemento
encontrado ou chega ao final
3 O próximo do nó anterior
recebe o endereço do próximo
do nó atual
4 O nó atual é desalocado da
memória
Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 11/ 37
Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Operações - Destruir

Exemplo: Destruir(L) Destruir:


1 Nó temporário (P = current)
aponta para o primeiro
elemento
2 O primeiro elemento da lista é
atualizado para o próximo
elemento
3 O nó temporário é desalocado
da memoria
4 Retorna para instrução 1 até
encontrar o último elemento
(null)

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 12/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Implementação

class Node:
item = None
proximo = None

def __init__(self,item):
self.item = item

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 13/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Implementação

class Lista_Encadeada:
inicio = None
tamanho = 0

def __init__(self):
self.inicio = Node(None)

def estaVazia(self):
return self.tamanho == 0

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 14/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Implementação

#inserir
def inserir(self, item, pos):
if pos <= self.tamanho:
p = self.inicio
for i in range(pos):
p = p.proximo
aux = Node(item)
aux.proximo = p.proximo
p.proximo = aux
self.tamanho += 1
else:
print(’operacao invalida’)

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 15/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Implementação

#remover
def remover(self, pos):
if not self.estaVazia() and pos<self.tamanho:
p = self.inicio
for i in range(pos):
p = p.proximo
aux = p.proximo
p.proximo = aux.proximo
item = aux.item
del aux
self.tamanho -=1
return item
else:
print(’operacao invalida’)

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 16/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Implementação

#imprimir
def imprimir(self):
p = self.inicio
for i in range(self.tamanho):
p = p.proximo
print(p.item)
print(’---’)

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 17/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Implementação

#buscar
def buscarPorItem(self, item):
p = self.inicio
for i in range(self.tamanho):
p = p.proximo
if p.item == item:
return i
return None

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 18/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista encadeada
Implementação

lista = Lista_Encadeada()
lista.inserir(’a’, 0)
lista.inserir(’b’, 0)
lista.inserir(’c’, 0)
lista.inserir(’d’, 0)
lista.imprimir()

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 19/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Exercı́cios

Exercı́cio
1 A implementação de lista apresentada possui operação de remoção recebendo a
posição que se deseja remover. Implemente uma operação de remoção que remova
o item passado como parâmetro, ou seja, um inteiro representando o item será
fornecido como parâmetro
2 A implementação de busca apresentada possui operação de remoção recebendo o
item que se deseja buscar. Implemente uma operação de busca que receba a posição
que se deseja, ou seja, um inteiro representando a posição será fornecida como
parâmetro

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 20/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista Duplamente Encadeada

Uma lista duplamente encadeada é uma estrutura de dados de


tamanho variável que pode armazenar elementos de um mesmo
tipo
Um nó de uma lista duplamente encadeada possui duas
referências: uma para o próximo nó; e outra para o nó anterior
Exemplo:

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 21/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista Duplamente Encadeada

Utilizando a informação contida nos nós de uma lista duplamente


encadeada é possı́vel iterar os elementos da lista nas duas
direções
Esta caracterı́stica permite que as operações sejam
implementadas de uma maneira mais simples
Os nós de uma lista duplamente encadeada utilizam mais
memória do que o de uma lista simplesmente encadeada

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 22/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista Duplamente Encadeada

Operações:
Criar lista vazia;
Verificar se a lista está vazia;
Inserir;
Pesquisar;
Remover;
Destruir a lista.

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 23/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Lista Duplamente Encadeada

Operações:
Criar lista vazia;
Verificar se a lista está vazia;
Inserir (no inı́cio);
Inserir (em uma posição);
Inserir (no final);
Pesquisar;
Remover (elemento);
Remover (posição);
Destruir a lista.

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 24/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Exercı́cios

Exercı́cio
1 Altere o código da lista encadeada para que o TAD seja uma lista duplamente
encadeada

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 25/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Listas com sentinela

É possı́vel adotar um nó de cabeçalho, o qual não faz parte da


lista, para armazenar alguma informação sobre a lista. Exemplo:
O dado armazenado no nó de cabeçalho indica o tamanho da lista;
O nó de cabeçalho possui um ponteiro para o último elemento da
lista.
Existem duas possibilidades de implementação para um nó
cabeçalho:
o nó é do mesmo tipo dos elementos da lista...
o nó é de um tipo diferente dos elementos da lista...

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 26/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Listas com sentinela

Exemplo:

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 27/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Listas com sentinela

Exemplo:

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 28/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Exercı́cios

Exercı́cio
1 Altere o código da lista encadeada para que o TAD seja uma lista encadeada com
sentinela contendo:
Uma referência para o inı́cio da lista
Uma referência para o final da lista
Uma indicação do tamanho da lista
2 As operações de inserção (inı́cio, posição, final) e remoção (inı́cio, posição, final)
podem ser simplificadas com a existência da referência para o final da lista? Se sim,
implemente estas simplificações

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 29/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Listas circulares

Exemplo:

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 30/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Listas circulares

Exemplo:

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 31/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Exercı́cios

Exercı́cio
1 Alguma operação do TAD lista deveria ser alterada? Se sim, forneça a
implementação destas

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 32/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Listas ordenadas

A pesquisa em uma lista ordenada pode ser melhorada


Como um elemento não pode ser acessado diretamente não é
possı́vel executar busca binária
A ordenação garante que se um elemento maior que o procurado
foi encontrado o elemento procurado não pertence a lista
É possı́vel utilizar busca linear ordenada

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 33/ 37


Lista encadeada
Lista Lista Duplamente Encadeada
Exercı́cios, Resumo e Referências Listas com sentinela
Listas circulares

Exercı́cios

Exercı́cio
1 Alguma operação do TAD lista deveria ser alterada? Se sim, forneça a
implementação destas

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 34/ 37


Lista
Exercı́cios, Resumo e Referências

Resumo

Resumo
Uma lista é uma estrutura de dados de tamanho variável que pode armazenar
elementos
Cada elemento da lista (nó) possui uma referência (endereço) para o próximo
elemento
Diversas variações de implementação de lista:
Lista encadeada
Lista duplamente encadeada
Lista circular
Lista com sentinela

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 35/ 37


Lista
Exercı́cios, Resumo e Referências

Leituras recomendadas

T. H. Cormen, C. E. Leiserson, R. L. Rivest e C. Stein


Algoritmos: Teoria e prática, 2002.
Capı́tulo 10 - Estruturas de dados elementares
S. L. Pereira
Estruturas de dados fundamentais, 2004.
Capı́tulo 02 - Listas lineares

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 36/ 37


Lista
Exercı́cios, Resumo e Referências

Perguntas?
Alexandre de Andrade Barbosa
alexandre.barbosa@arapiraca.ufal.br

Alexandre de Andrade Barbosa alexandre.barbosa@arapiraca.ufal.br 37/ 37

Você também pode gostar