Você está na página 1de 45

Estruturas de Dados

Lista Ligada
Profª. Dayse Silveira de Almeida
daysesa@ufg.br

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


Curso de Ciência da Computação
2019/2
Listas Lineares
• Listas são estruturas flexíveis que permitem manter uma
coleção ordenada de elementos de mesmo tipo

• Por ordenada entende-se que os elementos possuem


uma posição na lista e se pode identificar o sucessor e
predecessor dos elementos, com exceção do primeiro e
último elementos
Listas Lineares
• Listas são muito úteis em computação pois permitem
inserir, recuperar e remover elementos

• Diversos tipos de aplicações requerem uma lista


• Por exemplo, uma lista telefônica, um lista de tarefas, etc
TAD Listas
• Vamos definir um TAD com as principais operações sobre
uma lista

• Para simplificar vamos definir apenas as operações


principais, posteriormente, outras operações podem ser
definidas
TAD Listas
• TAD Listas, principais operações:
• 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
• Criar lista:
• Pré-condição: nenhuma
• Pós-condição: inicia a estrutura de dados

• Inserir elemento (última posição):


• Pré-condição: a lista não está cheia
• Pós-condição: insere um elemento na última 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
TAD Listas
• Como implementar o TAD Listas?

• Existe diversas formas diferentes de implementar, duas


entre as principais são:
• Estática (utilizando vetores)
• Dinâmica (utilizando listas ligadas)
Lista Ligada
Discussão Intuitiva
• Ponteiros são usados para construir estruturas, tais como
listas, a partir de componentes simples chamados nós
Lista Ligada
Discussão Intuitiva
• Este nó possui uma seta apontando para fora. Essa seta
representa um ponteiro
• Ponteiros são usados para conectar dois nós, formando
uma lista ligada
Lista Ligada
Discussão Intuitiva
• Listas ligadas são úteis pois podem ser utilizadas para
implementar o TAD lista
• Nesse caso, as operações inserção e remoção no meio da lista
podem ser mais eficientes

• Uma segunda vantagem é o fato de não ser necessário


informar o número de elementos em tempo de
compilação
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de remoção pode ser feita
da seguinte maneira:
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de remoção pode ser feita
da seguinte maneira:
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de remoção pode ser feita
da seguinte maneira:
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de remoção pode ser feita
da seguinte maneira:
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de inserção pode ser feita da
seguinte maneira:
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de inserção pode ser feita da
seguinte maneira:
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de inserção pode ser feita da
seguinte maneira:
Lista Ligada
Discussão Intuitiva
• Por exemplo, uma operação de inserção pode ser feita da
seguinte maneira:
Lista Ligada
Ponteiros em C
• Em C, pode-se declarar variáveis ponteiro por meio do
símbolo *
• Uma variável ponteiro, ao ser declarada, deve indicar o
tipo do dado a ser apontado
Lista Ligada
Ponteiros em C
• Ponteiros tipicamente apontam para variáveis
dinamicamente alocadas, ou simplesmente, variáveis
dinâmicas

• Variáveis dinâmicas são similares às variáveis comuns,


entretanto:
• Variáveis dinâmicas não são declaradas
• Variáveis dinâmicas não possuem identificadores
• Variáveis dinâmicas são criadas durante a execução do programa
Lista Ligada
Ponteiros em C
• Para criar uma variável dinâmica deve-se fazer uma
chamada à função malloc

• Uma chamada a malloc faz duas tarefas:


• Cria uma variável dinâmica em uma área de memória chamada
heap
• Faz com que o ponteiro aponte para essa variável dinâmica recém
criada
Lista Ligada
Ponteiros em C
• Em C, o nó apontado por P pode ser acessado pelo
operador de desreferenciação * ou pelo operador ->

• Por exemplo, para atribuir o valor ‘queijo’ ao campo nó da


variável dinâmica deve-se fazer:
• strcpy(P->Nome, “queijo”);
Lista Ligada
Ponteiros em C
Lista Ligada
Ponteiros em C
• Uma variável ponteiro pode ser alterada para apontar
diferentes variáveis dinâmicas em instante diferentes

• Essas modificações são feitas por meio do operador de


atribuição

• Se P1 e P2 são duas variáveis ponteiro, então P1 = P2


modifica P1 de forma que ele apontará para a mesma
variável que P2 aponta
Lista Ligada
Ponteiros em C
Lista Ligada
Ponteiros em C
• Repare na diferença entre fazer:

• P1 = P2

• *P1 = *P2
Lista Ligada
Ponteiros em C
• Repare na diferença entre fazer:

• P1 = P2

• *P1 = *P2
Lista Ligada
Ponteiros em C
• Repare na diferença entre fazer:

• P1 = P2

• *P1 = *P2
Lista Ligada
Ponteiros em C
• A função free é utilizada para desalocar uma variável
dinâmica alocada por malloc
Lista Ligada
• Para se criar uma lista ligada, é necessário criar um nó
que possua um ponteiro para o tipo de dados do próprio

Lista Ligada
• Como ligar o campo Prox do primeiro nó com o último
nó?
Lista Ligada
• Como ligar o campo Prox do primeiro nó com o último
nó?
Lista Ligada
• Como ligar o campo Prox do primeiro nó com o último
nó?

• Primeiro->Prox = Ultimo;
Lista Ligada
• Como ligar o campo Prox do segundo nó com o último
nó?
Lista Ligada
• Como ligar o campo Prox do segundo nó com o último
nó?
Lista Ligada
• Como ligar o campo Prox do segundo nó com o último
nó?

• Primeiro->Prox->Prox = Ultimo;
Lista Ligada
• Como alterar o campo Nome do último nó?
Lista Ligada
• Como alterar o campo Nome do último nó?
Lista Ligada
• Como alterar o campo Nome do último nó?

• strcpy(Primeiro->Prox->Prox->Nome, “Café”); (complicado)


• strcpy(Ultimo->Nome, “Café”); (melhor)
Lista Ligada
• O último nó não possui um sucessor
• Dessa forma, seu ponteiro Prox deve indicar isso por
meio do valor especial NULL
Lista Ligada
• O último nó não possui um sucessor
• Dessa forma, seu ponteiro Prox deve indicar isso por
meio do valor especial NULL

• Ultimo->Prox = NULL;
Exercícios
1. Faça um programa em C que leia uma série de valores
string e os armazene em uma lista ligada.

2. Percorra a lista ligada do exercício anterior e imprima


todos os valores presentes na lista.
Referências Utilizadas
• Ziviani, N. Projeto de Algoritmos, Thomson Learning, São
Paulo – SP, 2ª ed, 2004.

• Batista, Gustavo. Introdução às listas ligadas. Algoritmos


e Estruturas de Dados I. Slides. Ciência de Computação.
ICMC/USP, 2009.

Você também pode gostar