SlideShare una empresa de Scribd logo
1 de 102
Descargar para leer sin conexión
Listas Encadeadas
Prof: Sergio Souza Costa
Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com

https://sites.google.com/site/profsergiocosta/home
http://www.slideshare.net/skosta/presentations?order=popular
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
Roteiro
• Lista como estrutura encadeada.
• Codificação de listas encadeadas em C.
Como representar as listas na
memoria do computador?
Estruturas contíguas

Estruturas Encadeadas
Estruturas encadeadas
Nas estruturas contíguas a relação de ordem dos elementos é
estabelecida de forma física, a posição x2 sucede a posição de
x1 .
Nas estruturas encadeadas a sucessão dos elementos é
estabelecida de forma lógica, a posição x2 não
necessariamente sucede a de x1.
Não existe uma relação espacial (memória).
Deste modo, pode-se adicionar elementos dinamicamente,
mantendo a relação de ordem sem se preocupar de definir
o tamanho máximo de memoria.
Estruturas encadeadas
Uma lista pode ser implementada usando a estrutura
de dados listas encadeadas.
Estruturas encadeadas
Uma lista pode ser implementada usando a estrutura
de dados listas encadeadas.

Observem: listas encadeadas é uma outra estrutura de
dados, com suas propriedades, tipo abstrato de dados
e implementação.
Estruturas encadeadas
Começando por uma definição abstrata
sobre listas encadeadas ...
Estruturas encadeadas
Começando por uma definição abstrata
sobre listas encadeadas ...
Listas encadeadas
Uma lista encadeada é uma estrutura recursiva, ou
seja, definida em termos de si mesma.
Aqui definimos uma lista encadeada como:
• Uma sequência de 0 ou mais itens (ou elementos),
onde o seu tamanho e sua quantidade de itens.
• Uma lista encadeada vazia possui 0 itens e será
representada por [].
Listas encadeadas
Uma lista encadeada não vazia L consiste de dois atributos:
1.
2.

Primeiro[L] que é o primeiro item da lista e
Resto[L] que são os demais itens, ou seja, uma lista
contendo todos os itens com exceção do primeiro.
• Se uma lista L contem apenas um elemento, então
Resto[L] é uma lista vazia [].
• Deste modo, tudo que se aplica a lista L também se
aplica a Resto[L].
Listas encadeadas
Como uma lista pode ser vazia ou conter pelo menos um
item, ela requer dois construtores:
VAZIA(): cria uma lista vazia.
CONS(x, L): cria uma lista não vazia composta pelo
primeiro elemento x e um resto L.
Pode se dizer ainda que o construtor CONS
insere um item x a uma lista L.
LISTA encadeada - Operação "cons"
Exemplos:
A variável lista1 equivale a seguinte lista [1,4,5]:
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))
A variável lista2 equivale a seguinte lista [9,2,3]:
>lista2 = CONS (9, CONS (2, CONS (3, VAZIA ())))
Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))
Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))
= []
Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))
= []
= [5]
Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))
= []
= [5]
= [4,5]
Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))
= []
= [5]
= [4,5]
= [1,4,5]
Exercitando
Quais os valores das variáveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) )
B = Resto [A]
c = Resto [Resto [A]]
d = Primeiro [A]
e = Primeiro [Resto[A]]
f = Resto [Primeiro[a]]
Exercitando
Quais os valores das variáveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) )
B = Resto [A]
c = Resto [Resto [A]]
d = Primeiro [A]
e = Primeiro [Resto[A]]
f = Resto [Primeiro[a]]

[5,7,8]
Exercitando
Quais os valores das variáveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) )
B = Resto [A]

[7,8]

c = Resto [Resto [A]]
d = Primeiro [A]
e = Primeiro [Resto[A]]
f = Resto [Primeiro[a]]

[5,7,8]
Exercitando
Quais os valores das variáveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) )
B = Resto [A]

[7,8]

c = Resto [Resto [A]]
d = Primeiro [A]
e = Primeiro [Resto[A]]
f = Resto [Primeiro[a]]

[8]

[5,7,8]
Exercitando
Quais os valores das variáveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) )
B = Resto [A]

[7,8]
[8]

c = Resto [Resto [A]]
d = Primeiro [A]

5

e = Primeiro [Resto[A]]
f = Resto [Primeiro[a]]

[5,7,8]
Exercitando
Quais os valores das variáveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) )
B = Resto [A]

[7,8]
[8]

c = Resto [Resto [A]]
d = Primeiro [A]

5

e = Primeiro [Resto[A]]
f = Resto [Primeiro[a]]

7

[5,7,8]
Exercitando
Quais os valores das variáveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) )
B = Resto [A]

[7,8]
[8]

c = Resto [Resto [A]]
d = Primeiro [A]

5

e = Primeiro [Resto[A]]

7

f = Resto [Primeiro[a]]

inválida

[5,7,8]
LISTA: Tipo de dados abstrato
Lembrando as 5 operações básicas de lista.

Operação

Descrição

Tamanho (L)

Retorna o número de elementos de L

Inserir (L,x)

Insere um elemento x a L

Busca (L, x)

Busca um elemento x em L, retorna seu indice.

ElementoEm(L, i)

Retorna um elemento de L localizado em i.

Remove (L, i)

Remove um elemento de L localizado em i.
Listas encadeadas e funções recursivas
Como a lista encadeada é uma estrutura recursiva, as
operações sobre estas são usualmente desta forma.
Lembrando .......
Uma função recursiva consiste em duas partes:
• O caso trivial, cuja solução é conhecida;
• Um método geral que reduz o problema a um ou mais
problemas menores (subproblemas) de mesma
natureza.
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Tamanho (L)
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)
Se L = VAZIA() então

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)
Se L = VAZIA() então

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Pela definição o tamanho de
uma lista vazia é 0.
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)
Se L = VAZIA() então
retorna 0
se não

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Pela definição o tamanho de
uma lista vazia é 0.
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)
Se L = VAZIA() então
retorna 0
se não

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Pela definição o tamanho de
uma lista vazia é 0.
Se e não vazia, ela tem pelo menos um
elemento, adicionado ao tamanho do
resto da lista
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)
Se L = VAZIA() então
retorna 0
se não
retorna 1 + Tamanho (Resto[L])

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Pela definição o tamanho de
uma lista vazia é 0.
Se e não vazia, ela tem pelo menos um
elemento, adicionado ao tamanho do
resto da lista
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)
Se L = VAZIA() então
retorna 0
se não
retorna 1 + Tamanho (Resto[L])

Caso trivial

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Pela definição o tamanho de
uma lista vazia é 0.
Se e não vazia, ela tem pelo menos um
elemento, adicionado ao tamanho do
resto da lista
Operações: tamanho
Por exemplo, a operação Tamanho retorna a quantidade de
itens em uma lista:
Pela definição uma lista pode ser
Tamanho (L)
Se L = VAZIA() então
retorna 0
se não
retorna 1 + Tamanho (Resto[L])

Caso trivial
Método geral

vazia, ou conter pelo menos um
elemento. Então precisamos tratar
estes dois casos.
Pela definição o tamanho de
uma lista vazia é 0.
Se e não vazia, ela tem pelo menos um
elemento, adicionado ao tamanho do
resto da lista
Operações: tamanho
A simulação da avaliação desta função recursiva
é mostrada a seguir:

Tamanho [3,5,7,8]
Operações: tamanho
A simulação da avaliação desta função recursiva
é mostrada a seguir:

Tamanho [3,5,7,8]
= 1 + Tamanho [5,7,8]
Operações: tamanho
A simulação da avaliação desta função recursiva
é mostrada a seguir:

Tamanho [3,5,7,8]
= 1 + Tamanho [5,7,8]
= 1 + 1 + Tamanho [7,8]
Operações: tamanho
A simulação da avaliação desta função recursiva
é mostrada a seguir:

Tamanho [3,5,7,8]
= 1 + Tamanho [5,7,8]
= 1 + 1 + Tamanho [7,8]
= 1 + 1 + 1 + Tamanho [8]
Operações: tamanho
A simulação da avaliação desta função recursiva
é mostrada a seguir:

Tamanho [3,5,7,8]
= 1 + Tamanho [5,7,8]
= 1 + 1 + Tamanho [7,8]
= 1 + 1 + 1 + Tamanho [8]
= 1 +1 + 1 + 1 + Tamanho []
Operações: tamanho
A simulação da avaliação desta função recursiva
é mostrada a seguir:

Tamanho [3,5,7,8]
= 1 + Tamanho [5,7,8]
= 1 + 1 + Tamanho [7,8]
= 1 + 1 + 1 + Tamanho [8]
= 1 +1 + 1 + 1 + Tamanho []
= 1 +1 + 1 + 1 + 0
Operações: tamanho
A simulação da avaliação desta função recursiva
é mostrada a seguir:

Tamanho [3,5,7,8]
= 1 + Tamanho [5,7,8]
= 1 + 1 + Tamanho [7,8]
= 1 + 1 + 1 + Tamanho [8]
= 1 +1 + 1 + 1 + Tamanho []
= 1 +1 + 1 + 1 + 0
=4
Operações: Inserção
Inserir no inicio, basta retornar a chamada a
função CONS.

L = [ 6,7,5,4]
Inserir( L, x)
1. retorna CONS (x, L)

Inserir (L, 2)

L = [ 2, 6,7,5,4]
Operações: Inserção
Inserir no inicio, basta retornar a chamada a
função CONS.

L = [ 6,7,5,4]
Inserir( L, x)
1. retorna CONS (x, L)

Inserir (L, 2)

L = [ 2, 6,7,5,4]
Depois falaremos sobre inserção no fim da lista.
Operações: Busca
Buscar um elemento x em L.
Busca(L, x)
Operações: Busca
Buscar um elemento x em L.
Busca(L, x)
Se L = VAZIA() então
senao

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Operações: Busca
Buscar um elemento x em L.
Busca(L, x)
Se L = VAZIA() então
senao

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Se L é vazia, então sabemos que X não
está em L. É o caso trivial.
Operações: Busca
Buscar um elemento x em L.
Busca(L, x)
Se L = VAZIA() então
retorna NULL;
senao

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Se L é vazia, então sabemos que X não
está em L. É o caso trivial.
Operações: Busca
Buscar um elemento x em L.
Busca(L, x)
Se L = VAZIA() então
retorna NULL;
senao

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Se L é vazia, então sabemos que X não
está em L. É o caso trivial.
Caso contrário, precisamos verificar se
x é o primeiro, ou se ele está
localizado no restante da lista.
Operações: Busca
Buscar um elemento x em L.
Busca(L, x)
Se L = VAZIA() então
retorna NULL;
senao
Se Primeiro[L] = x entao
retorna L
senao
retorna Busca (resto[L],x)

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Se L é vazia, então sabemos que X não
está em L. É o caso trivial.
Caso contrário, precisamos verificar se
x é o primeiro, ou se ele está
localizado no restante da lista.
Operações: ElementoEm

Neste caso, não existe um índice, é necessário
percorrer a lista até chegar na posição desejada.
ElementoEm( L, i)
Se L = Vazia entao
senao

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Operações: ElementoEm

Neste caso, não existe um índice, é necessário
percorrer a lista até chegar na posição desejada.
ElementoEm( L, i)
Se L = Vazia entao
erro (“lista vazia”)
senao

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Lista vazia, é um erro
Operações: ElementoEm

Neste caso, não existe um índice, é necessário
percorrer a lista até chegar na posição desejada.
ElementoEm( L, i)
Se L = Vazia entao
erro (“lista vazia”)
senao
Se i = 1 entao
retorna Primeiro[L]
senao
retorna
ElementoEm(Resto[L], i-1))

Como sempre, preciso tratar os
casos quando a lista é vazia e
quando não é:
Lista vazia, é um erro
Caso contrário, se o indice for 1,
entao retorne o primeiro, caso
contrario retorne o ElementoEm
(resto[L], indice -1)
Operações: ElementoEm
Simulação

ElementoEm ([5,6,7,8], 3)

ElementoEm( L, i)
Se L = Vazia entao
erro (“lista vazia”)
senao
Se i = 1 entao
retorna Primeiro[L]
senao
retorna
ElementoEm(Resto[L], i-1))
Operações: ElementoEm
Simulação

ElementoEm ([5,6,7,8], 3)
= ElementoEm ([6,7,8],2)

ElementoEm( L, i)
Se L = Vazia entao
erro (“lista vazia”)
senao
Se i = 1 entao
retorna Primeiro[L]
senao
retorna
ElementoEm(Resto[L], i-1))
Operações: ElementoEm
Simulação

ElementoEm ([5,6,7,8], 3)
= ElementoEm ([6,7,8],2)
= ElementoEm ([7,8],1)

ElementoEm( L, i)
Se L = Vazia entao
erro (“lista vazia”)
senao
Se i = 1 entao
retorna Primeiro[L]
senao
retorna
ElementoEm(Resto[L], i-1))
Operações: ElementoEm
Simulação

ElementoEm ([5,6,7,8], 3)
= ElementoEm ([6,7,8],2)
= ElementoEm ([7,8],1)
=7

ElementoEm( L, i)
Se L = Vazia entao
erro (“lista vazia”)
senao
Se i = 1 entao
retorna Primeiro[L]
senao
retorna
ElementoEm(Resto[L], i-1))
Atividade
Considerando apenas as 4 operações (Cons, Vazia, Primeiro, Resto) ,
podemos codificar diversas outras funções. No papel, codifiquem as
funções abaixo (versão iterativa e recursiva):
a) int soma (List l )
ex: soma [1,2,6] → 9
b) int produto (List l )
ex: produto [1,2,6] -> 12
c) void imprimir (List a)
ex: imprimir ([1,2]) → [1,2]
d) List concatena (List l1,List l2)
ex: concatena ([1,2],[3,4]) → [1,2,3,4]
Entendi o TAD da lista, mas está muito
abstrato. Como escrevo isso em uma
linguagem de programação.
Entendi o TAD da lista, mas está muito
abstrato. Como escrevo isso em uma
linguagem de programação.

Ponto crucial: como as linguagens suportam
tipos de dados recursivos. Alguém?
Entendi o TAD da lista, mas está muito
abstrato. Como escrevo isso em uma
linguagem de programação.

Ponto crucial: como as linguagens suportam
tipos de dados recursivos. Alguém?
Vocês já usaram.
Entendi o TAD da lista, mas está muito
abstrato. Como escrevo isso em uma
linguagem de programação.

Ponto crucial: como as linguagens suportam
tipos de dados recursivos. Alguém?
Vocês já usaram.

Ponteiros
Lista encadeada: Codificação - C
Como criamos novos tipos de dados em C ?
Lista encadeada: Codificação - C
Como criamos novos tipos de dados em C ?
typedef struct Lista {

} Lista;

Esta é a sintaxe básica
para criar qualquer tipo
de dado, mas quais
eram os atributos de
uma lista não vazia ?
Lista encadeada: Codificação - C
Como criamos novos tipos de dados em C ?
typedef struct Lista {
int primeiro;

} Lista;

Primeiro, que retorna o
primeiro valor da lista.
Neste caso assumindo
uma lista homogênea
de inteiros.
Lista encadeada: Codificação - C
Como criamos novos tipos de dados em C ?
typedef struct Lista {
int primeiro;
struct Lista* resto;
} Lista;

Resto, os elementos
de uma lista com
excessão do primeiro.
Neste, caso é do tipo
lista.
Lista encadeada: Codificação - C
Como criamos novos tipos de dados em C ?
typedef struct Lista {
int primeiro;
struct Lista* resto;
} Lista;

Observem a recursividade.

Resto, os elementos
de uma lista com
excessão do primeiro.
Neste, caso é do tipo
lista.
Ok, mas esta é uma lista não vazia, e uma lista
vazia, como represento ?

Como estamos trabalhando com ponteiros,
representamos uma lista vazia por um
ponteiro nulo, ou seja, pelo NULL em C.
Lista encadeada: Codificação - C
Como iremos codificar a operação que cria uma
lista vazia ?

Lista* Vazia () {
Lista encadeada: Codificação - C
Como iremos codificar a operação que cria uma
lista vazia ?

Lista* Vazia () {
return NULL;
}
Lista encadeada: Codificação - C
E a operação Cons ?
Lista* Cons (int p, Lista* r) {
Lista* l =
(Lista*)malloc (sizeof(Lista));
l->primeiro = p;
l->resto = r;
return l;
}
Lista encadeada: Codificação - C
E a operação Cons ?
Lista* Cons (int p, Lista* r) {
Lista* l =
(Lista*)malloc (sizeof(Lista));
l->primeiro = p;
l->resto = r;
return l;
}
É alocado a área de memoria
para a lista.
Lista encadeada: Codificação - C
E a operação Cons ?
Lista* Cons (int p, Lista* r) {
Lista* l =
(Lista*)malloc (sizeof(Lista));
l->primeiro = p;
l->resto = r;
return l;
}
Atribuo os valores dos
parâmetros para os atributos
da lista.
Lista encadeada: Codificação - C
E a operação Cons ?
Lista* Cons (int p, Lista* r) {
Lista* l =
(Lista*)malloc (sizeof(Lista));
l->primeiro = p;
l->resto = r;
return l;
}
Retorno a lista criada.
L = CONS (1, CONS (4, CONS (5, VAZIA ())))

L
Representação gráfica das listas encadeadas
L = CONS (1, CONS (4, CONS (5, VAZIA ())))

L
NULL
Representação gráfica das listas encadeadas
L = CONS (1, CONS (4, CONS (5, VAZIA ())))

L

5
NULL
Representação gráfica das listas encadeadas
L = CONS (1, CONS (4, CONS (5, VAZIA ())))

L

4

5
NULL
Representação gráfica das listas encadeadas
L = CONS (1, CONS (4, CONS (5, VAZIA ())))

L

1

4

5
NULL
Representação gráfica das listas encadeadas
L = CONS (1, CONS (4, CONS (5, VAZIA ())))

L

1

4

5
NULL

Por isso o nome de listas
encadeadas ou ligadas
Como removo um elemento de uma lista
encadeada.
Como removo um elemento de uma lista
encadeada.

L

1

4

5
NULL
Supondo que eu queira remover o primeiro
elemento ....

L

1

4

5
NULL
Supondo que eu queira remover o primeiro
elemento ....
Basta retornar o resto da lista, ou seja, a
partir do segundo.

L

4

5
NULL
Supondo que eu queira remover o
segundo elemento ....

L

1

4

5
NULL
Supondo que eu queira remover o segundo
elemento ....
Basta fazer o primeiro apontar para o
terceiro ...

L

1

4

5
NULL
Remoção em listas encadeadas
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1)
return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}
Remoção em listas encadeadas
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1)
return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

É o primeiro
elemento,
retorno o resto.
Remoção em listas encadeadas
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1)
return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

Caso contrário,
percorro a lista
até pos-1.
Remoção em listas encadeadas
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1)
return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

Faço ele
apontar para o
sucessor do seu
sucessor.
Remover (L, 3)

L

1

7

4

5
NULL

Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

I

Pos
3
Remover (L, 3)

L

1

7

4

5
NULL

Aux
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

I

Pos
3
Remover (L, 3)

L

1

7

4

5
NULL

Aux
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

I

Pos
3
Remover (L, 3)

L

1

7

4

5
NULL

Aux
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

I

Pos

2

3
Remover (L, 3)

L

1

7

4

5
NULL

Aux
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

I

Pos

2

3
Remover (L, 3)

L

1

7

4

5
NULL

Aux
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

I

Pos

3

3
Remover (L, 3)

L

1

7

4

5
NULL

Aux
Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

I

Pos

3

3
Remover (L, 3)

L

1

O que irá acontece com o
espaço de memoria onde
está localizado o 4?

Lista* remove (int pos, Lista* l){
int i ;
Lista* aux = l;
if (pos == 1) return l->resto;
for (i=2; i < pos; i++)
aux = aux->resto;
aux->resto = aux->resto->resto;
return l;
}

7

4

5
NULL

Aux
I

Pos

3

3
Pontos chaves
• Nas estruturas encadeadas os itens são
adicionados dinamicamente.
• Listas encadeadas são estruturas recursivas e
suportadas por ponteiros em C.
Referências
• CORMEN, Thomas H. et al. Algoritmos: teoria
e prática. Rio de Janeiro: Elsevier, 2002.
• SILVA, Osmar Quirino da. Estrutura de dados e
algoritmos usando C: fundamentos e
aplicações. Rio de Janeiro:Ciência Moderna,
2007. 458 p. ISBN 9788573936117
• CELES, Waldemar; CERQUEIRA, Renato;
RANGEL, José Lucas. Introdução a estruturas
de dados. Editora Campus, 2004.
Listas Encadeadas

Más contenido relacionado

La actualidad más candente

Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaDelacyr Ferreira
 
Caminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-FordCaminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-FordGabriel Albuquerque
 
So gabarito exerciciosescalonamentocpu-2012
So gabarito exerciciosescalonamentocpu-2012So gabarito exerciciosescalonamentocpu-2012
So gabarito exerciciosescalonamentocpu-2012Bill Lima
 
Algoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registrosAlgoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registrosMauro Pereira
 
Capítulo 6 Sistemas Operacionais Modernos
Capítulo 6 Sistemas Operacionais ModernosCapítulo 6 Sistemas Operacionais Modernos
Capítulo 6 Sistemas Operacionais ModernosWellington Oliveira
 
Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Ricardo Terra
 
Sistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 DeadlockSistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 DeadlockWellington Oliveira
 
Java vetores e matrizes
Java   vetores e matrizesJava   vetores e matrizes
Java vetores e matrizesArmando Daniel
 
Peterson Critical Section Problem Solution
Peterson Critical Section Problem SolutionPeterson Critical Section Problem Solution
Peterson Critical Section Problem SolutionBipul Chandra Kar
 
Gerenciamento de Memoria
Gerenciamento de MemoriaGerenciamento de Memoria
Gerenciamento de Memoriaaudineisilva1
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 

La actualidad más candente (20)

Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise Assintótica
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 
Caminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-FordCaminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-Ford
 
Apostila UML
Apostila UMLApostila UML
Apostila UML
 
Data Structure
Data StructureData Structure
Data Structure
 
Memória virtual
Memória virtualMemória virtual
Memória virtual
 
So gabarito exerciciosescalonamentocpu-2012
So gabarito exerciciosescalonamentocpu-2012So gabarito exerciciosescalonamentocpu-2012
So gabarito exerciciosescalonamentocpu-2012
 
Algoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registrosAlgoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registros
 
Capítulo 6 Sistemas Operacionais Modernos
Capítulo 6 Sistemas Operacionais ModernosCapítulo 6 Sistemas Operacionais Modernos
Capítulo 6 Sistemas Operacionais Modernos
 
SO-08 Sistemas de Arquivos
SO-08 Sistemas de ArquivosSO-08 Sistemas de Arquivos
SO-08 Sistemas de Arquivos
 
Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)Apostila Linguagens Formais e Autômatos (LFA)
Apostila Linguagens Formais e Autômatos (LFA)
 
Árvores Rubro Negra
Árvores Rubro NegraÁrvores Rubro Negra
Árvores Rubro Negra
 
Sistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 DeadlockSistemas Operacionais Modernos Capítulo 3 Deadlock
Sistemas Operacionais Modernos Capítulo 3 Deadlock
 
Checklist-formatação do computador
Checklist-formatação do computadorChecklist-formatação do computador
Checklist-formatação do computador
 
Java vetores e matrizes
Java   vetores e matrizesJava   vetores e matrizes
Java vetores e matrizes
 
Peterson Critical Section Problem Solution
Peterson Critical Section Problem SolutionPeterson Critical Section Problem Solution
Peterson Critical Section Problem Solution
 
Gerenciamento de Memoria
Gerenciamento de MemoriaGerenciamento de Memoria
Gerenciamento de Memoria
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Árvores Rubro Negras
Árvores Rubro NegrasÁrvores Rubro Negras
Árvores Rubro Negras
 
Quick sort
Quick sortQuick sort
Quick sort
 

Similar a Listas Encadeadas

Programando em python listas
Programando em python   listasProgramando em python   listas
Programando em python listassamuelthiago
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursaosamuelthiago
 
Listas em Prolog
Listas em PrologListas em Prolog
Listas em PrologNatã Melo
 
Apostilade precalculodiferencialeintegral(1) (1)
Apostilade precalculodiferencialeintegral(1) (1)Apostilade precalculodiferencialeintegral(1) (1)
Apostilade precalculodiferencialeintegral(1) (1)W. Carvalho Carvalho
 
004 programando em python - listas
004   programando em python - listas004   programando em python - listas
004 programando em python - listasLeandro Barbosa
 
Listas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem CListas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem CMarcosEvandroCintra
 
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.pptAula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.pptssuserd654cb1
 
Aula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.pptAula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.pptssuserd654cb1
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoArthur Xavier
 
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarHaskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarCRISLANIO MACEDO
 

Similar a Listas Encadeadas (20)

Programando em python listas
Programando em python   listasProgramando em python   listas
Programando em python listas
 
Aula Prolog 09 - Listas
Aula Prolog 09 - ListasAula Prolog 09 - Listas
Aula Prolog 09 - Listas
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
 
Listas em Prolog
Listas em PrologListas em Prolog
Listas em Prolog
 
python
pythonpython
python
 
05 listas
05 listas05 listas
05 listas
 
Apostilade precalculodiferencialeintegral(1) (1)
Apostilade precalculodiferencialeintegral(1) (1)Apostilade precalculodiferencialeintegral(1) (1)
Apostilade precalculodiferencialeintegral(1) (1)
 
004 programando em python - listas
004   programando em python - listas004   programando em python - listas
004 programando em python - listas
 
Haskell aula3 listas
Haskell aula3 listasHaskell aula3 listas
Haskell aula3 listas
 
Java 12 Colecoes
Java 12 ColecoesJava 12 Colecoes
Java 12 Colecoes
 
Listas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem CListas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem C
 
Aula 01
Aula 01Aula 01
Aula 01
 
Matemática básica
Matemática básicaMatemática básica
Matemática básica
 
Lpiii dp-apostila
Lpiii dp-apostilaLpiii dp-apostila
Lpiii dp-apostila
 
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.pptAula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
 
Aula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.pptAula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.ppt
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
 
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarHaskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
 
Slide_Python.pdf
Slide_Python.pdfSlide_Python.pdf
Slide_Python.pdf
 
Python 02
Python 02Python 02
Python 02
 

Más de Sérgio Souza Costa

Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasSérgio Souza Costa
 
De algoritmos à programas de computador
De algoritmos à programas de computadorDe algoritmos à programas de computador
De algoritmos à programas de computadorSérgio Souza Costa
 
Introdução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosIntrodução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosSérgio Souza Costa
 
Minicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosMinicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosSérgio Souza Costa
 
Banco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoBanco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoSérgio Souza Costa
 
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemBanco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemSérgio Souza Costa
 
Banco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaBanco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaSérgio Souza Costa
 
Linguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoLinguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoSérgio Souza Costa
 
Gödel’s incompleteness theorems
Gödel’s incompleteness theoremsGödel’s incompleteness theorems
Gödel’s incompleteness theoremsSérgio Souza Costa
 
DBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsDBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsSérgio Souza Costa
 
Conceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosConceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosSérgio Souza Costa
 
Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Sérgio Souza Costa
 
Relações (composição e agregação)
Relações (composição e agregação)Relações (composição e agregação)
Relações (composição e agregação)Sérgio Souza Costa
 

Más de Sérgio Souza Costa (20)

Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicas
 
De algoritmos à programas de computador
De algoritmos à programas de computadorDe algoritmos à programas de computador
De algoritmos à programas de computador
 
Introdução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosIntrodução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmos
 
Minicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosMinicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficos
 
Modelagem de dados geográficos
Modelagem de dados geográficosModelagem de dados geográficos
Modelagem de dados geográficos
 
Banco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoBanco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de Encerramento
 
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemBanco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
 
Banco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaBanco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de abertura
 
Linguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoLinguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - Introdução
 
Gödel’s incompleteness theorems
Gödel’s incompleteness theoremsGödel’s incompleteness theorems
Gödel’s incompleteness theorems
 
Turing e o problema da decisão
Turing e o problema da decisãoTuring e o problema da decisão
Turing e o problema da decisão
 
DBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsDBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cells
 
Conceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosConceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetos
 
Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)
 
Herança e Encapsulamento
Herança e EncapsulamentoHerança e Encapsulamento
Herança e Encapsulamento
 
Relações (composição e agregação)
Relações (composição e agregação)Relações (composição e agregação)
Relações (composição e agregação)
 
Abstract classes and interfaces
Abstract classes and interfacesAbstract classes and interfaces
Abstract classes and interfaces
 
Introdução ao Prolog
Introdução ao PrologIntrodução ao Prolog
Introdução ao Prolog
 
Heap - Python
Heap - PythonHeap - Python
Heap - Python
 
Paradigma lógico
Paradigma lógicoParadigma lógico
Paradigma lógico
 

Listas Encadeadas

  • 2. Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home http://www.slideshare.net/skosta/presentations?order=popular https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta
  • 3. Roteiro • Lista como estrutura encadeada. • Codificação de listas encadeadas em C.
  • 4. Como representar as listas na memoria do computador? Estruturas contíguas Estruturas Encadeadas
  • 5. Estruturas encadeadas Nas estruturas contíguas a relação de ordem dos elementos é estabelecida de forma física, a posição x2 sucede a posição de x1 . Nas estruturas encadeadas a sucessão dos elementos é estabelecida de forma lógica, a posição x2 não necessariamente sucede a de x1. Não existe uma relação espacial (memória). Deste modo, pode-se adicionar elementos dinamicamente, mantendo a relação de ordem sem se preocupar de definir o tamanho máximo de memoria.
  • 6. Estruturas encadeadas Uma lista pode ser implementada usando a estrutura de dados listas encadeadas.
  • 7. Estruturas encadeadas Uma lista pode ser implementada usando a estrutura de dados listas encadeadas. Observem: listas encadeadas é uma outra estrutura de dados, com suas propriedades, tipo abstrato de dados e implementação.
  • 8. Estruturas encadeadas Começando por uma definição abstrata sobre listas encadeadas ...
  • 9. Estruturas encadeadas Começando por uma definição abstrata sobre listas encadeadas ...
  • 10. Listas encadeadas Uma lista encadeada é uma estrutura recursiva, ou seja, definida em termos de si mesma. Aqui definimos uma lista encadeada como: • Uma sequência de 0 ou mais itens (ou elementos), onde o seu tamanho e sua quantidade de itens. • Uma lista encadeada vazia possui 0 itens e será representada por [].
  • 11. Listas encadeadas Uma lista encadeada não vazia L consiste de dois atributos: 1. 2. Primeiro[L] que é o primeiro item da lista e Resto[L] que são os demais itens, ou seja, uma lista contendo todos os itens com exceção do primeiro. • Se uma lista L contem apenas um elemento, então Resto[L] é uma lista vazia []. • Deste modo, tudo que se aplica a lista L também se aplica a Resto[L].
  • 12. Listas encadeadas Como uma lista pode ser vazia ou conter pelo menos um item, ela requer dois construtores: VAZIA(): cria uma lista vazia. CONS(x, L): cria uma lista não vazia composta pelo primeiro elemento x e um resto L. Pode se dizer ainda que o construtor CONS insere um item x a uma lista L.
  • 13. LISTA encadeada - Operação "cons" Exemplos: A variável lista1 equivale a seguinte lista [1,4,5]: >lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) A variável lista2 equivale a seguinte lista [9,2,3]: >lista2 = CONS (9, CONS (2, CONS (3, VAZIA ())))
  • 14. Listas encadeadas >lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))
  • 15. Listas encadeadas >lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = []
  • 16. Listas encadeadas >lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = [] = [5]
  • 17. Listas encadeadas >lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = [] = [5] = [4,5]
  • 18. Listas encadeadas >lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = [] = [5] = [4,5] = [1,4,5]
  • 19. Exercitando Quais os valores das variáveis abaixo: A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]
  • 20. Exercitando Quais os valores das variáveis abaixo: A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]] [5,7,8]
  • 21. Exercitando Quais os valores das variáveis abaixo: A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] [7,8] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]] [5,7,8]
  • 22. Exercitando Quais os valores das variáveis abaixo: A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] [7,8] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]] [8] [5,7,8]
  • 23. Exercitando Quais os valores das variáveis abaixo: A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] [7,8] [8] c = Resto [Resto [A]] d = Primeiro [A] 5 e = Primeiro [Resto[A]] f = Resto [Primeiro[a]] [5,7,8]
  • 24. Exercitando Quais os valores das variáveis abaixo: A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] [7,8] [8] c = Resto [Resto [A]] d = Primeiro [A] 5 e = Primeiro [Resto[A]] f = Resto [Primeiro[a]] 7 [5,7,8]
  • 25. Exercitando Quais os valores das variáveis abaixo: A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] [7,8] [8] c = Resto [Resto [A]] d = Primeiro [A] 5 e = Primeiro [Resto[A]] 7 f = Resto [Primeiro[a]] inválida [5,7,8]
  • 26. LISTA: Tipo de dados abstrato Lembrando as 5 operações básicas de lista. Operação Descrição Tamanho (L) Retorna o número de elementos de L Inserir (L,x) Insere um elemento x a L Busca (L, x) Busca um elemento x em L, retorna seu indice. ElementoEm(L, i) Retorna um elemento de L localizado em i. Remove (L, i) Remove um elemento de L localizado em i.
  • 27. Listas encadeadas e funções recursivas Como a lista encadeada é uma estrutura recursiva, as operações sobre estas são usualmente desta forma. Lembrando ....... Uma função recursiva consiste em duas partes: • O caso trivial, cuja solução é conhecida; • Um método geral que reduz o problema a um ou mais problemas menores (subproblemas) de mesma natureza.
  • 28. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Tamanho (L)
  • 29. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos.
  • 30. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) Se L = VAZIA() então vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos.
  • 31. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) Se L = VAZIA() então vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos. Pela definição o tamanho de uma lista vazia é 0.
  • 32. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) Se L = VAZIA() então retorna 0 se não vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos. Pela definição o tamanho de uma lista vazia é 0.
  • 33. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) Se L = VAZIA() então retorna 0 se não vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos. Pela definição o tamanho de uma lista vazia é 0. Se e não vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista
  • 34. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) Se L = VAZIA() então retorna 0 se não retorna 1 + Tamanho (Resto[L]) vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos. Pela definição o tamanho de uma lista vazia é 0. Se e não vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista
  • 35. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) Se L = VAZIA() então retorna 0 se não retorna 1 + Tamanho (Resto[L]) Caso trivial vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos. Pela definição o tamanho de uma lista vazia é 0. Se e não vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista
  • 36. Operações: tamanho Por exemplo, a operação Tamanho retorna a quantidade de itens em uma lista: Pela definição uma lista pode ser Tamanho (L) Se L = VAZIA() então retorna 0 se não retorna 1 + Tamanho (Resto[L]) Caso trivial Método geral vazia, ou conter pelo menos um elemento. Então precisamos tratar estes dois casos. Pela definição o tamanho de uma lista vazia é 0. Se e não vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista
  • 37. Operações: tamanho A simulação da avaliação desta função recursiva é mostrada a seguir: Tamanho [3,5,7,8]
  • 38. Operações: tamanho A simulação da avaliação desta função recursiva é mostrada a seguir: Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8]
  • 39. Operações: tamanho A simulação da avaliação desta função recursiva é mostrada a seguir: Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8]
  • 40. Operações: tamanho A simulação da avaliação desta função recursiva é mostrada a seguir: Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8]
  • 41. Operações: tamanho A simulação da avaliação desta função recursiva é mostrada a seguir: Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8] = 1 +1 + 1 + 1 + Tamanho []
  • 42. Operações: tamanho A simulação da avaliação desta função recursiva é mostrada a seguir: Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8] = 1 +1 + 1 + 1 + Tamanho [] = 1 +1 + 1 + 1 + 0
  • 43. Operações: tamanho A simulação da avaliação desta função recursiva é mostrada a seguir: Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8] = 1 +1 + 1 + 1 + Tamanho [] = 1 +1 + 1 + 1 + 0 =4
  • 44. Operações: Inserção Inserir no inicio, basta retornar a chamada a função CONS. L = [ 6,7,5,4] Inserir( L, x) 1. retorna CONS (x, L) Inserir (L, 2) L = [ 2, 6,7,5,4]
  • 45. Operações: Inserção Inserir no inicio, basta retornar a chamada a função CONS. L = [ 6,7,5,4] Inserir( L, x) 1. retorna CONS (x, L) Inserir (L, 2) L = [ 2, 6,7,5,4] Depois falaremos sobre inserção no fim da lista.
  • 46. Operações: Busca Buscar um elemento x em L. Busca(L, x)
  • 47. Operações: Busca Buscar um elemento x em L. Busca(L, x) Se L = VAZIA() então senao Como sempre, preciso tratar os casos quando a lista é vazia e quando não é:
  • 48. Operações: Busca Buscar um elemento x em L. Busca(L, x) Se L = VAZIA() então senao Como sempre, preciso tratar os casos quando a lista é vazia e quando não é: Se L é vazia, então sabemos que X não está em L. É o caso trivial.
  • 49. Operações: Busca Buscar um elemento x em L. Busca(L, x) Se L = VAZIA() então retorna NULL; senao Como sempre, preciso tratar os casos quando a lista é vazia e quando não é: Se L é vazia, então sabemos que X não está em L. É o caso trivial.
  • 50. Operações: Busca Buscar um elemento x em L. Busca(L, x) Se L = VAZIA() então retorna NULL; senao Como sempre, preciso tratar os casos quando a lista é vazia e quando não é: Se L é vazia, então sabemos que X não está em L. É o caso trivial. Caso contrário, precisamos verificar se x é o primeiro, ou se ele está localizado no restante da lista.
  • 51. Operações: Busca Buscar um elemento x em L. Busca(L, x) Se L = VAZIA() então retorna NULL; senao Se Primeiro[L] = x entao retorna L senao retorna Busca (resto[L],x) Como sempre, preciso tratar os casos quando a lista é vazia e quando não é: Se L é vazia, então sabemos que X não está em L. É o caso trivial. Caso contrário, precisamos verificar se x é o primeiro, ou se ele está localizado no restante da lista.
  • 52. Operações: ElementoEm Neste caso, não existe um índice, é necessário percorrer a lista até chegar na posição desejada. ElementoEm( L, i) Se L = Vazia entao senao Como sempre, preciso tratar os casos quando a lista é vazia e quando não é:
  • 53. Operações: ElementoEm Neste caso, não existe um índice, é necessário percorrer a lista até chegar na posição desejada. ElementoEm( L, i) Se L = Vazia entao erro (“lista vazia”) senao Como sempre, preciso tratar os casos quando a lista é vazia e quando não é: Lista vazia, é um erro
  • 54. Operações: ElementoEm Neste caso, não existe um índice, é necessário percorrer a lista até chegar na posição desejada. ElementoEm( L, i) Se L = Vazia entao erro (“lista vazia”) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1)) Como sempre, preciso tratar os casos quando a lista é vazia e quando não é: Lista vazia, é um erro Caso contrário, se o indice for 1, entao retorne o primeiro, caso contrario retorne o ElementoEm (resto[L], indice -1)
  • 55. Operações: ElementoEm Simulação ElementoEm ([5,6,7,8], 3) ElementoEm( L, i) Se L = Vazia entao erro (“lista vazia”) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))
  • 56. Operações: ElementoEm Simulação ElementoEm ([5,6,7,8], 3) = ElementoEm ([6,7,8],2) ElementoEm( L, i) Se L = Vazia entao erro (“lista vazia”) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))
  • 57. Operações: ElementoEm Simulação ElementoEm ([5,6,7,8], 3) = ElementoEm ([6,7,8],2) = ElementoEm ([7,8],1) ElementoEm( L, i) Se L = Vazia entao erro (“lista vazia”) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))
  • 58. Operações: ElementoEm Simulação ElementoEm ([5,6,7,8], 3) = ElementoEm ([6,7,8],2) = ElementoEm ([7,8],1) =7 ElementoEm( L, i) Se L = Vazia entao erro (“lista vazia”) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))
  • 59. Atividade Considerando apenas as 4 operações (Cons, Vazia, Primeiro, Resto) , podemos codificar diversas outras funções. No papel, codifiquem as funções abaixo (versão iterativa e recursiva): a) int soma (List l ) ex: soma [1,2,6] → 9 b) int produto (List l ) ex: produto [1,2,6] -> 12 c) void imprimir (List a) ex: imprimir ([1,2]) → [1,2] d) List concatena (List l1,List l2) ex: concatena ([1,2],[3,4]) → [1,2,3,4]
  • 60. Entendi o TAD da lista, mas está muito abstrato. Como escrevo isso em uma linguagem de programação.
  • 61. Entendi o TAD da lista, mas está muito abstrato. Como escrevo isso em uma linguagem de programação. Ponto crucial: como as linguagens suportam tipos de dados recursivos. Alguém?
  • 62. Entendi o TAD da lista, mas está muito abstrato. Como escrevo isso em uma linguagem de programação. Ponto crucial: como as linguagens suportam tipos de dados recursivos. Alguém? Vocês já usaram.
  • 63. Entendi o TAD da lista, mas está muito abstrato. Como escrevo isso em uma linguagem de programação. Ponto crucial: como as linguagens suportam tipos de dados recursivos. Alguém? Vocês já usaram. Ponteiros
  • 64. Lista encadeada: Codificação - C Como criamos novos tipos de dados em C ?
  • 65. Lista encadeada: Codificação - C Como criamos novos tipos de dados em C ? typedef struct Lista { } Lista; Esta é a sintaxe básica para criar qualquer tipo de dado, mas quais eram os atributos de uma lista não vazia ?
  • 66. Lista encadeada: Codificação - C Como criamos novos tipos de dados em C ? typedef struct Lista { int primeiro; } Lista; Primeiro, que retorna o primeiro valor da lista. Neste caso assumindo uma lista homogênea de inteiros.
  • 67. Lista encadeada: Codificação - C Como criamos novos tipos de dados em C ? typedef struct Lista { int primeiro; struct Lista* resto; } Lista; Resto, os elementos de uma lista com excessão do primeiro. Neste, caso é do tipo lista.
  • 68. Lista encadeada: Codificação - C Como criamos novos tipos de dados em C ? typedef struct Lista { int primeiro; struct Lista* resto; } Lista; Observem a recursividade. Resto, os elementos de uma lista com excessão do primeiro. Neste, caso é do tipo lista.
  • 69. Ok, mas esta é uma lista não vazia, e uma lista vazia, como represento ? Como estamos trabalhando com ponteiros, representamos uma lista vazia por um ponteiro nulo, ou seja, pelo NULL em C.
  • 70. Lista encadeada: Codificação - C Como iremos codificar a operação que cria uma lista vazia ? Lista* Vazia () {
  • 71. Lista encadeada: Codificação - C Como iremos codificar a operação que cria uma lista vazia ? Lista* Vazia () { return NULL; }
  • 72. Lista encadeada: Codificação - C E a operação Cons ? Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; }
  • 73. Lista encadeada: Codificação - C E a operação Cons ? Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; } É alocado a área de memoria para a lista.
  • 74. Lista encadeada: Codificação - C E a operação Cons ? Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; } Atribuo os valores dos parâmetros para os atributos da lista.
  • 75. Lista encadeada: Codificação - C E a operação Cons ? Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; } Retorno a lista criada.
  • 76. L = CONS (1, CONS (4, CONS (5, VAZIA ()))) L
  • 77. Representação gráfica das listas encadeadas L = CONS (1, CONS (4, CONS (5, VAZIA ()))) L NULL
  • 78. Representação gráfica das listas encadeadas L = CONS (1, CONS (4, CONS (5, VAZIA ()))) L 5 NULL
  • 79. Representação gráfica das listas encadeadas L = CONS (1, CONS (4, CONS (5, VAZIA ()))) L 4 5 NULL
  • 80. Representação gráfica das listas encadeadas L = CONS (1, CONS (4, CONS (5, VAZIA ()))) L 1 4 5 NULL
  • 81. Representação gráfica das listas encadeadas L = CONS (1, CONS (4, CONS (5, VAZIA ()))) L 1 4 5 NULL Por isso o nome de listas encadeadas ou ligadas
  • 82. Como removo um elemento de uma lista encadeada.
  • 83. Como removo um elemento de uma lista encadeada. L 1 4 5 NULL
  • 84. Supondo que eu queira remover o primeiro elemento .... L 1 4 5 NULL
  • 85. Supondo que eu queira remover o primeiro elemento .... Basta retornar o resto da lista, ou seja, a partir do segundo. L 4 5 NULL
  • 86. Supondo que eu queira remover o segundo elemento .... L 1 4 5 NULL
  • 87. Supondo que eu queira remover o segundo elemento .... Basta fazer o primeiro apontar para o terceiro ... L 1 4 5 NULL
  • 88. Remoção em listas encadeadas Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }
  • 89. Remoção em listas encadeadas Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } É o primeiro elemento, retorno o resto.
  • 90. Remoção em listas encadeadas Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } Caso contrário, percorro a lista até pos-1.
  • 91. Remoção em listas encadeadas Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } Faço ele apontar para o sucessor do seu sucessor.
  • 92. Remover (L, 3) L 1 7 4 5 NULL Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } I Pos 3
  • 93. Remover (L, 3) L 1 7 4 5 NULL Aux Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } I Pos 3
  • 94. Remover (L, 3) L 1 7 4 5 NULL Aux Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } I Pos 3
  • 95. Remover (L, 3) L 1 7 4 5 NULL Aux Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } I Pos 2 3
  • 96. Remover (L, 3) L 1 7 4 5 NULL Aux Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } I Pos 2 3
  • 97. Remover (L, 3) L 1 7 4 5 NULL Aux Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } I Pos 3 3
  • 98. Remover (L, 3) L 1 7 4 5 NULL Aux Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } I Pos 3 3
  • 99. Remover (L, 3) L 1 O que irá acontece com o espaço de memoria onde está localizado o 4? Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; } 7 4 5 NULL Aux I Pos 3 3
  • 100. Pontos chaves • Nas estruturas encadeadas os itens são adicionados dinamicamente. • Listas encadeadas são estruturas recursivas e suportadas por ponteiros em C.
  • 101. Referências • CORMEN, Thomas H. et al. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 2002. • SILVA, Osmar Quirino da. Estrutura de dados e algoritmos usando C: fundamentos e aplicações. Rio de Janeiro:Ciência Moderna, 2007. 458 p. ISBN 9788573936117 • CELES, Waldemar; CERQUEIRA, Renato; RANGEL, José Lucas. Introdução a estruturas de dados. Editora Campus, 2004.

Notas del editor

  1. Podemos colocar um conjunto de tarefas em uma lista
  2. Qual o caso trivial ?
  3. Qual o caso trivial ?
  4. Qual o caso trivial