Você está na página 1de 46

Estruturas de Dados

Listas Ligadas
Profª. Dayse Silveira de Almeida
daysesa@ufg.br

Universidade Federal de Goiás (UFG)/Regional Catalão


Curso de Ciências da Computação
2019/2
TAD Listas Ligadas
• Nesta aula vamos implementar as operações do TAD
Lista utilizando Lista Ligada
TAD Listas Ligadas
• Para recordar, essas são as principais operações do TAD
Listas:
• Criar lista
• Inserir elemento
• Pesquisar elemento
• Remover elemento
• Recuperar elemento
• Contar número de elementos
• Verificar se a lista está vazia
• Verificar se a lista está cheia
TAD Listas Ligadas
• Antes de começarmos, precisamos definir como a lista
será representada

• Uma forma bastante comum é manter uma variável


ponteiro para o primeiro elemento da lista ligada
TAD Listas Ligadas
• Convenciona-se que essa variável ponteiro deve ter valor
NULL quando a lista estiver vazia

• Portanto, essa deve ser a iniciação da lista e também a


forma de se verificar se ela se encontra vazia
TAD Listas Ligadas
• Outro detalhe importante é quanto as posições:
• Na implementação com vetores, uma posição é um valor inteiro
entre 0 e o campo Ultimo
• Com listas ligadas, uma posição passa ser um ponteiro que aponta
um determinado nó da lista

• Vamos analisar cada uma das operações do TAD Lista


TAD Listas
• Criar lista:
• Pré-condição: nenhuma
• Pós-condição: inicia a estrutura de dados

• Inserir elemento (primeira posição):


• Pré-condição: existe memória disponível
• Pós-condição: insere um elemento na primeira posição

• Pesquisar elemento:
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou um valor
especial caso não exista
TAD Listas
• Remover elemento (por posição):
• Pré-condição: uma posição válida da lista é informada;
• Pós-condição: o elemento na posição fornecida é removido da lista

• Recuperar elemento (por posição)


• Pré-condição: uma posição válida da lista é informada
• Pós-condição: o elemento na posição fornecida é retornado

• Contar número de elementos


• Pré-condição: nenhuma
• Pós-condição: retorna o número de elementos na lista
TAD Listas
• Verificar se a lista está vazia;
• Pré-condição: nenhuma
• Pós-condição: retorna true se a lista estiver vazia e false caso
contrário

• Verificar se a lista está cheia (???)


• Pré-condição: nenhuma
• Pós-condição: retorna true se a lista estiver cheia e false caso
contrário
Listas – Implementação Dinâmica
Criar lista
• Pré-condição: nenhuma
• Pós-condição: inicia a estrutura de dados
Inserir elemento (primeira posição)
• Pré-condição: existe memória disponível
• Pós-condição: insere um elemento na primeira posição
Inserir elemento (primeira posição)
Memória Disponível
• Diferente da implementação com vetores, a lista ligada
não requer especificar um tamanho para a estrutura

• Entretanto, a memória heap não é ilimitada e é sempre


importante verificar se existe memória disponível ao
chamar malloc

• Em C, a função malloc atribui o valor NULL à variável


ponteiro quando não existe memória disponível
Pesquisar elemento
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou
um valor especial caso não exista
Pesquisar elemento
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou
um valor especial caso não exista
Pesquisar elemento
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou
um valor especial caso não exista
Pesquisar elemento
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou
um valor especial caso não exista

• P = P->prox;
Pesquisar elemento
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou
um valor especial caso não exista
Pesquisar elemento
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou
um valor especial caso não exista
Pesquisar elemento
• Pré-condição: nenhuma
• Pós-condição: retorna a posição do elemento na lista, ou
um valor especial caso não exista
Pesquisar elemento
Remover elemento (por posição)
• Pré-condição: uma posição válida da lista é informada
• Pós-condição: o elemento na posição fornecida é
removido da lista
Remover elemento (por posição)
• Pré-condição: uma posição válida da lista é informada
• Pós-condição: o elemento na posição fornecida é
removido da lista
Remover elemento (por posição)
• Pré-condição: uma posição válida da lista é informada
• Pós-condição: o elemento na posição fornecida é
removido da lista
Remover elemento (por posição)
• Pré-condição: uma posição válida da lista é informada
• Pós-condição: o elemento na posição fornecida é
removido da lista
Remover elemento (por posição)
• Pré-condição: uma posição válida da lista é informada
• Pós-condição: o elemento na posição fornecida é
removido da lista
Remover elemento (por posição)
Recuperar elemento (por posição)
• Pré-condição: uma posição válida da lista é informada
• Pós-condição: o elemento na posição fornecida é
retornado

• Nesse caso
• int pos
Recuperar elemento (por posição)
Contar número de elementos
• Pré-condição: nenhuma
• Pós-condição: retorna o número de elementos na lista
Verificar se a lista está vazia
• Pré-condição: nenhuma
• Pós-condição: retorna true se a lista estiver vazia e false
caso contrário
Verificar se a lista está cheia
• Pré-condição: nenhuma
• Pós-condição: retorna true se a lista estiver cheia e false
caso contrário

• Esta operação não faz tanto sentido como no caso das


listas implementadas com vetor
Inserir elemento (última posição)
• Insere na última posição
• A inserção implementada insere na primeira posição. Ela tem o
inconveniente de manter a lista na ordem inversa da inserção

• A inserção na última posição pode ser uma operação bastante


cara, pois exigiria percorrer toda a lista ligada para encontrar o
último nó

• Mas poderíamos alterar a nossa estrutura de dados da seguinte


maneira...
Insere na última posição
Insere na última posição
• Insere na última posição
• A lista mantém dois ponteiros
• O ponteiro Último tem a função de facilitar as inserções no final da
lista
Insere na última posição
• Sem o ponteiro Último:
Insere em qualquer posição
• Para inserir em qualquer posição, precisamos de um
ponteiro indicando a posição de inserção

• Nesse caso,
• int pos
Insere em qualquer posição
• Para inserir em qualquer posição, precisamos de um
ponteiro indicando a posição de inserção
Insere em qualquer posição
• Para inserir em qualquer posição, precisamos de um
ponteiro indicando a posição de inserção
Insere em qualquer posição
• Para inserir em qualquer posição, precisamos de um
ponteiro indicando a posição de inserção
Insere em qualquer posição
• Para inserir em qualquer posição, precisamos de um
ponteiro indicando a posição de inserção
Insere em qualquer posição
• Para inserir em qualquer posição, precisamos de um
ponteiro indicando a posição de inserção
Insere em qualquer posição
Exercício
• Implementar o TAD Lista com o tipo lista definido por um
registro com dois ponteiros primeiro e ultimo e um
contador de número de elementos inseridos.
Referência
• Batista, Gustavo. TAD Listas e Listas Ligadas. Algoritmos
e Estruturas de Dados I. Slides. Ciência de Computação.
ICMC/USP, 2009.

Você também pode gostar