Professional Documents
Culture Documents
Slvio)
pag. 1
Aula 04 - Contedo
1) Listas Ligadas e suas representaes
2) Algoritmos de lista ligada utilizando alocao dinmica e vetores
3) Exerccios
Listas
Uma lista uma coleo ordenada de componentes do mesmo tipo (registro).
Por exemplo: catlogo telefnico, cartas do baralho, alunos do curso de EDA etc.
Operaes efetuadas numa lista
inserir um elemento (em qualquer posio)
remover um elemento (de qualquer posio)
acessar um elemento da lista (consultar ou alterar)
verificar se a lista est vazia ou cheia
Lista Seqencial
Para cada componente da lista, o sucessor deste componente est armazenado na
posio fsica seguinte da lista. Normalmente este tipo de lista implementado com
vetores.
Vantagens
rapidez nas operaes de acesso (consulta, alterao, impresso)
algoritmos simples
Desvantagens
operaes de insero e deleo provocam movimentao dos dados
Exemplo:
Inserir o elemento C na lista
Deletar o elemento F da lista
Imprimir o elemento da posio 3
B
0
D
1
Lista Ligada
Coleo ordenada de elementos (registros) em que cada um deles possui uma
referncia (campo) indicando a localizao do prximo componente da lista. A
ordenao da lista dada explicitamente por esta referncia (campo).
Vantagens
operaes de insero e remoo no exigem movimentao de dados
Desvantagens
para acessar um elemento deve-se percorrer a lista
algoritmos mais complexos se comparados com a lista seqencial
pag. 2
Prox 3
Info
1 -1
8 12 -1
Cabec1 = 0
Cabec2 = 11
4 14 13 10 5
9
10
11
-1
12 13 14
Livre = 2
Cabec1
Cabec2
Livre
Cabec
Santos
32
Rio Branco
18
Prox 3
Info
1 -1
8 12 -1
Topo1 = 0
Topo2 = 11
Topo1
4 14 13 10 5
9
10
11
Livre = 2
Topo2
-1
12 13 14
Convenes:
Topo
= -1 indica pilha vazia
Livre
= -1 indica pilha cheia
TAM_VET = 15
INICIALIZAO
Topo = -1
Livre = 0
Para i = 0 at TAM_VET-1 faa
P[TAM_VET-1].Prox = -1
P[i].Prox = i + 1
INSERO
Se Livre = -1 ento INSERO IMPOSSVEL
seno
atual = Livre
Livre = P[Livre].Prox
P[atual].Info = Elem
P[atual].Prox = Topo
Topo = atual
fimse
DELEO
Se Topo = -1 ento DELEO IMPOSSVEL
seno
atual = Topo
Elem = P[Topo].Info
Topo = P[Topo].Prox
P[atual].Prox = Livre
Livre = atual
fimse
Televiso
8
Som
15
Geladeira
3
Convenes:
Topo = NULL indica pilha vazia
INICIALIZAO
Topo = NULL
INSERO
E = Alocar espao
E->Info = Elemento
E->Prox = Topo
Topo = E
REMOO
Se Topo = NULL ento REMOO IMPOSSIVEL
seno
Elem = Topo->Info
E = Topo
Topo = Topo->Prox
Liberar espao(E)
Fimse
pag. 3
Prox 3
Info
1 -1
8 12 -1
pag. 4
4 14 13 10 5
9
10
11
-1
12 13 14
frente2
fim2
Convenes:
fim = frente = -1 indica fila vazia
Livre = -1 indica fila cheia
TAM_VET = 15
INICIALIZAO
frente = -1
fim
= -1
Livre = 0
Para i = 0 at TAM_VET-1 faa
F[TAM_VET-1].Prox = -1
F[i].Prox = i + 1
INSERO
Se Livre = -1 ento INSERO IMPOSSVEL
seno
atual = Livre
Livre = F[Livre].Prox
F[atual].Info = Elem
F[atual].Prox = -1
Se fim = -1 ento
frente = fim = atual
seno
F[fim].Prox = atual
fim = atual
fimse
fimse
DELEO
Se frente = -1 ento DELEO IMPOSSVEL
seno
atual = frente
Elem = F[frente].Info
frente = F[frente].Prox
Se frente = -1 ento Fim = -1
F[atual].Prox = Livre
Livre = atual
fimse
pag. 5
Fim
Televiso
Som
Geladeira
15
Convenes:
Frente = Fim = NULL indica fila vazia
INICIALIZAO
Frente = Fim = NULL
INSERO
E = Alocar Espao
E->Info = Elemento
E->Prox = NULL
Se Fim = NULL ento
Fim = Frente = E
seno
Fim->Prox = E
Fim = E
fimse
REMOO
Se Frente = NULL ento REMOO IMPOSSIVEL
seno
E = Frente
Elemento = E->Info
Frente = E->Prox
liberar espao(E)
Se Frente = NULL ento
Fim = NULL
fimse
fimse
Exemplo 4.5 Fila Circular utilizando estrutura com vetor (arquivo Ex405.cpp)
Prox 3
Info
8 12 11
fim1 = 4
fim2 = 8
4 14 13 10 5
9
10
Livre = 2
fim1
fim2
Convenes:
fim = frente = -1 indica fila vazia
Livre = -1 indica fila cheia
TAM_VET = 15
11
-1
12 13 14
pag. 6
FC[i].Prox = i + 1
INSERO
Se Livre = -1 ento INSERO IMPOSSVEL
seno
atual = Livre
Livre = FC[Livre].Prox
FC[atual].Info = Elem
Se fim = -1 ento
FC[atual].Prox = atual
seno
FC[atual].Prox = FC[fim].Prox
FC[fim].Prox = atual
fimse
fim = atual
fimse
DELEO
Se fim = -1 entoDELEO IMPOSSVEL
seno
atual = FC[Fim].Prox
Elem = FC[atual].Info
Se (atual = fim)
fim = -1
seno
FC[Fim].Prox = FC[atual].Prox
fimse
FC[atual].Prox = Livre
Livre = atual
fimse
Som
15
Convenes:
Fim = NULL indica fila vazia
INICIALIZAO
Fim = NULL
INSERO
E = Alocar Espao
E->Info = Elemento
Se Fim = NULL ento
Fim = E
Fim->Prox = E
seno
E->Prox = Fim->Prox
Fim->Prox = E
Fim = E
fimse
REMOO
Se Fim = NULL ento REMOO IMPOSSVEL
seno
E = Fim->Prox
Geladeira
3
pag. 7
Elemento = E->Info
Fim->Prox = E->Prox
Se Fim = E ento
Fim = NULL
fimse
Liberar espao(E)
fimse
Exemplo 4.7
Ex407.cpp)
Prox 3
Info
y
8 10 5
1 -1 -1 11 12 -1
4 14
Cabec1 = 0
Cabec2 = 6
10
11
Livre = 2
Cabec1
Cabec2
Convenes:
Cabec = -1 indica lista vazia
Livre = -1 indica lista cheia
TAM_VET = 15
INICIALIZAO
Cabec = -1
Livre = 0
Para i = 0 at TAM_VET-1 faa LISTA[i].Prox = i+1
LISTA[TAM_VET-1] = -1
INSERO
Se Livre = -1 ento INSERO IMPOSSVEL
seno
Se Cabec = -1 ento
Cabec = Livre
LISTA[Cabec].Info = Elemento
Livre = LISTA[Livre].Prox
LISTA[Cabec].Prox = -1
seno
aux = Cabec
ant = -1
Enquanto aux != -1 e LISTA[aux].Info < Elemento
ant = aux
aux = LISTA[aux].Prox
FimEnquanto
atual = Livre
Livre = LISTA[Livre].Prox
LISTA[atual].Info = Elemento
Se (ant = -1) ento
LISTA[atual].Prox = Cabec
Cabec = atual
seno
LISTA[ant].Prox = atual
fimse
LISTA[atual].Prox = aux
fimse
fimse
REMOO
13
12 13 14
Isadora R.
25
Letcia S.
23
Convenes:
Cabec = NULL indica lista vazia
INICIALIZAO
Cabec = NULL
INSERO
E = Alocar Espao
E->Info = Elemento
E->Prox = NULL
aux = Cabec
ant = NULL
Enquanto aux != NULL e aux->Info < Elemento
ant = aux
aux = aux->Prox
FimEnquanto
Se ant = NULL ento
E->Prox = Cabec
Cabec = E
seno
ant->Prox = E
E->Prox = aux
FimSe
REMOO
Se Cabec = NULL ento LISTA VAZIA - REMOO IMPOSSVEL
seno
aux = Cabec
ant = NULL
Enquanto aux != NULL e aux->Info != Elemento
ant = aux
aux = aux->Prox
FimEnquanto
Se aux = NULL ento ELEM. INEXISTENTE - REMOO IMPOSSVEL
Seno
Elemento = aux->Info
Se ant = NULL ento
Cabec = aux->Prox
pag. 8
pag. 9
seno
ant->Prox = aux->Prox
fimse
Liberar espao (aux)
fimse
fimse
-1
Info
Prox 3
Cabec
1 -1 -1
8
6
6
7
5
8
Cabec = 0
Fim = 4
Livre = 2
4
9
Convenes:
Cabec = -1 indica lista vazia
Livre = -1 indica lista cheia
TAM_VET = 10
INICIALIZAO
Cabec = -1
Fim
= -1
Livre = 0
Para k = 0 at TAM_VET - 1 faa LDL[k].Prox = k+1
LDL[TAM_VET-1].Prox = -1
INSERO
Se Livre = -1 ento INSERO IMPOSSIVEL
seno
atual = Livre
Livre = LDL[Livre].Prox
LDL[atual].Info = Elemento
LDL[atual].Prox = -1
LDL[atual].Ant = -1
Se Cabec = -1 ento
Cabec = Fim = atual
seno
aux = Cabec
Enquanto aux != -1 e LDL[aux].Info < Elemento
aux = LDL[aux].Prox
FimEnquanto
Se aux = -1 ento
LDL[atual].Ant = Fim
LDL[Fim].Prox = atual
Fim = atual
seno
LDL[LDL[aux].Ant].Prox = atual
LDL[atual].Ant = LDL[aux].Ant
LDL[atual].Prox = aux
LDL[aux].Ant = atual
fimse
fimse
fimse
REMOO
Se Cabec = -1 ento REMOO IMPOSSVEL
Fim
pag. 10
seno
aux = Cabec
Enquanto aux != -1 e LDL[aux].Info != Elem
aux = LDL[aux].Prox
FimEnquanto
Se aux = -1 ento ERRO - Elem Inexistente
Seno
Elemento = LDL[atual].Info
Se aux = Cabec ento
Cabec = LDL[aux].Prox
Se Cabec != -1 ento
LDL[Cabec].Ant = -1
seno
Cabec = Fim = -1
fimse
seno
se aux = Fim
LDL[LDL[aux].Ant].Prox = -1
Fim = LDL[aux].Ant
seno
LDL[LDL[aux].Ant].Prox = LDL[aux].Prox
LDL[LDL[aux].Prox].Ant = LDL[aux].Ant
fimse
LDL[aux].Prox = Livre
Livre = aux
fimse
fimse
Cabec
Claudia
Raia
28
Isadora
Ribeiro
25
Luma de
Oliveira
23
INICIALIZAO
Cebec = NULL
Fim
= NULL
INSERO
E = Alocar Espao
E->Info = Elemento
E->Prox = NULL
E->Ant = NULL
Se Cebec = NULL ento
Cabec = Fim = E
seno
aux = Cabec
Enquanto aux != NULL e aux->Info < Elemento
aux = aux->Prox
FimEnquanto
Se aux = NULL ento
E->Ant = Fim
Fim->Prox = E
Fim = E
seno
E->Prox = aux
Se aux = Cabec ento
aux->Ant = E
Fim
pag. 11
Cabec = E
seno
aux->Ant->Prox = E
E->Ant = aux->Ant
E->Prox = aux
aux->Ant = E
fimse
fimse
fimse
REMOO
Se Cabec = NULL ento LISTA VAZIA - REM. IMPOSSVEL
seno
aux = Cabec
Enquanto aux != 0 e aux->Info != Elemento
aux = aux->Prox
FimEnquanto
Se aux = NULL ento ELEM NO EXISTE - REM. IMPOSSVEL
Seno
Elemento = aux->Info
Se aux = Cabec
Cabec = aux->Prox
Se Cabec = NULL ento
Fim = NULL
seno
Cabec->Ant = NULL
fimse
seno
se aux = Fim ento
Fim = Aux->Ant
Fim->Prox = NULL
seno
aux->Ant->Prox = aux->Prox
aux->Prox->Ant = aux->Ant
fimse
fimse
fimse
Elemento = aux->Info
Liberar espao (aux)
fimse
Exerccios
4.01) A estrutura abaixo contm uma lista ligada ordenada alfabeticamente:
(exerccio resolvido)
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- -- M -- B -- E -- F
Prox 09 -1 05 01 06 -1 10 00 03 11 08 02
Cabec = 07
Fim = 05
Livre = 04
a) Inserir o elemento H
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H M -- B -- E -- F
Prox 09 -1 05 01 02 -1 10 00 03 11 08 04
Cabec = 07
Fim = 05
Livre = 06
b) Inserir o elemento D
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H M D B -- E -- F
Prox 06 -1 05 01 02 -1 09 00 03 11 08 04
Cabec = 07
Fim = 05
Livre = 10
c) Inserir o elemento A
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H M D B -- E A F
Prox 06 -1 05 01 02 -1 09 00 03 11 07 04
Cabec = 10
Fim = 05
Livre = 08
d) Inserir o elemento P
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H M D B P E A F
Prox 06 -1 05 01 02 08 09 00 -1 11 07 04
Cabec = 10
Fim = 08
Livre = 03
e) Deletar o elemento M
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H -- D B P E A F
Prox 06 -1 08 01 02 03 09 00 -1 11 07 04
Cabec = 10
Fim = 08
Livre = 05
f) Deletar o elemento B
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H -- D -- P E A F
Prox 06 -1 08 01 02 03 09 05 -1 11 00 04
Cabec = 10
Fim = 08
Livre = 07
g) Deletar o elemento A
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H -- D -- P E -- F
Prox 06 -1 08 01 02 03 09 05 -1 11 07 04
Cabec = 00
Fim = 08
Livre = 10
h) Inserir o elemento N
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H -- D -- P E N F
Prox 06 -1 10 01 02 03 09 05 -1 11 08 04
Cabec = 00
Fim = 08
Livre = 07
i) Deletar o elemento P
00 01 02 03 04 05 06 07 08 09 10 11
Info
C -- K -- H -- D -- -- E N F
Prox 06 -1 10 01 02 03 09 05 07 11 -1 04
pag. 12
Cabec = 00
Fim = 10
Livre = 08
pag. 13
pag. 14
Topo1 = 05
Cabec1= 12
Topo2= 15
Fim1 = 13
Topo3 = 00
Cabec2= 00
Livre= 11
Fim2 = 00
Topo2= 15
Fim1 = 13
Topo3 = 11
Cabec2= 00
Livre= 16
Fim2 = 00
b) Remover da pilha 1
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
Info
F e C Y -- -- -- a -- -c z B A -- X -Prox 03 08 13 00 16 14 09 00 00 02 00 01 00 07 04 06
Topo1 = 10
Cabec1= 12
Topo2= 15
Fim1 = 13
Topo3 = 11
Cabec2= 00
LIvre= 05
Fim2 = 00
Topo2= 15
Fim1 = 13
Topo3 = 11
Cabec2= 05
Livre= 16
Fim2 = 05
Topo2= 15
Fim1 = 16
Topo3 = 11
Cabec2= 05
Livre= 06
Fim2 = 05
Topo2= 15
Fim1 = 16
Topo3 = 11
Cabec2= 05
Livre= 14
Fim2 = 06
pag. 15
f) Deletar da fila 1
Info
Prox
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
F e C Y M N -- a -- c z -- A -- X D
03 08 13 00 06 00 09 00 00 02 00 14 16 07 04 00
Topo1 = 10
Cabec1= 01
Topo2= 15
Fim1 = 16
Topo3 = 11
Cabec2= 05
Livre= 12
Fim2 = 06
Topo2= 12
Fim1 = 16
Topo3 = 11
Cabec2= 05
Livre= 14
Fim2 = 06
Topo2= 12
Fim1 = 16
Topo3 = 11
Cabec2= 05
Livre= 07
Fim2 = 14
Topo2= 12
Fim1 = 16
Topo3 = 11
Cabec2= 05
Livre= 09
Fim2 = 14
Topo2= 12
Fim1 = 09
Topo3 = 11
Cabec2= 05
Livre= 00
Fim2 = 14
pag. 16
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
----------------------------------------------------Ant
-- 12 10 -- 03 -- -- -- -- 00 -- 15 -- -- 05 -Info
z R F x H -- -- a -- C -- N w -- K -Prox 13 00 05 08 15 14 00 01 07 03 09 02 04 16 12 11
----------------------------------------------------FrenteDL = 10 FimDL = 02 FimCirc = 13 Livre = 06
a) Inserir na lista dup. ligada o elemento D
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
----------------------------------------------------Ant
-- 12 06 -- 03 10 -- -- -- 00 -- 15 -- -- 05 -Info
z R F x H D -- a -- C -- N w -- K -Prox 13 00 05 08 15 03 00 01 07 06 09 02 04 16 12 11
----------------------------------------------------FrenteDL = 10 FimDL = 02 FimCirc = 13 Livre = 14
b) Inserir na lista dup. ligada o elemento M
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
----------------------------------------------------Ant
-- 12 06 -- 03 10 -- -- -- 00 -- 14 -- 15 05 -Info
z R F x H D -- a -- C -- N w M K -Prox 13 00 05 08 15 03 00 01 07 06 09 02 04 12 14 11
----------------------------------------------------FrenteDL = 10 FimDL = 02 FimCirc = 13 Livre = 16
c) Inserir na fila circular o elemento b
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
----------------------------------------------------Ant
-- 12 06 -- 03 10 -- -- -- 00 -- 14 -- 15 05 -Info
z R F x H D -- a -- C -- N w M K b
Prox 13 00 05 08 15 03 00 01 07 06 09 02 16 12 14 04
----------------------------------------------------FrenteDL = 10 FimDL = 02 FimCirc = 16 Livre = 11
d) Inserir na fila circular o elemento y
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
----------------------------------------------------Ant
-- 12 06 -- 03 10 -- -- -- 00 -- 14 -- 15 05 -Info
z R F x H D -- a -- C y N w M K b
Prox 13 00 05 08 15 03 00 01 07 06 04 02 16 12 14 11
----------------------------------------------------FrenteDL = 10 FimDL = 02 FimCirc = 11 Livre = 09
e) Inserir na lista dup. ligada o elemento A
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
----------------------------------------------------Ant
-- 12 06 -- 03 10 -- -- 00 09 -- 14 -- 15 05 -Info
z R F x H D -- a A C y N w M K b
Prox 13 00 05 08 15 03 00 01 10 06 04 02 16 12 14 11
-----------------------------------------------------
FrenteDL = 09
FimDL = 02
FimCirc = 11
pag. 17
Livre = 07
pag. 18
Info
06
00
08
01
02
07
09
05
10
00
K
C
H
F
-
Cabec = 03
Fim = 02
Livre = 04
Info
13
15
01
00
00
17
11
05
14
19
00
08
06
00
07
12
00
20
04
16
F
a
D
z
M
c
Y
x
b
A
R
d
B
k
-
Topo1 = 02
Topo2 = 10
Inic1 = 03
Fim1 = 17
Inic2 = 09
Fim2 = 14
Livre = 18
pag. 19
4.06) A estrutura abaixo manipula uma PILHA, uma FILA, uma LISTA
CIRCULAR ordenada alfabeticamente e uma LISTA DUPLAMENTE LIGADA
tambm ordenada alfabeticamente.
#
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Prox
15
06
05
00
09
04
25
16
21
14
24
22
20
08
13
10
01
30
12
00
00
23
07
02
27
00
26
19
28
29
Info
N
F
e
J
b
H
-o
f
m
B
-R
n
P
q
M
--S
g
--C
-------
Ant
17
-----------15
-01
-00
--13
-----------
Livre = 18
1
Cabea = [ 03
2
11
3
10
4
17 ]
1
= [ 21
2
04
3
16
4
20 ]
Fim
Cabea[1] = 03 e Fim[1] = 21 so
respectivamente o incio e o fim
de uma PILHA
Cabea[2] = 11 e Fim[2] = 04 so
respectivamente o incio e o fim
de uma FILA
Cabea[3] = 10 e Fim[3] = 16 so
respectivamente o incio e o fim
de um LISTA CIRCULAR ordenada
alfabeticamente
Cabea[4] = 17 e Fim[4] = 20 so
respectivamente o incio e o fim
de um LISTA DUPLAMENTE LIGADA
ordenada alfabeticamente
pag. 20
circular (tambm ordenada). Alterar tanto os algoritmos que trabalham com arranjo
como os que trabalham com alocao dinmica.
4.08) Utilizando a estrutura de dados baseada em apontadores utilizando
alocao dinmica, escreva algoritmos que realizem as seguintes operaes:
Concatenar duas listas (juntar uma no final da outra)
Remover todos os elementos de uma lista
Inverter uma lista ( pode-se utilizar recursividade )
Combinar duas listas ordenadas numa nica lista ordenada
Acessar o n-simo elemento de uma lista (busca do n-simo elemento)
Acessar um elemento particular da lista (busca de um elemento qualquer)
Contar o nmero de elementos de uma lista
Fazer uma cpia da lista
Montar uma nova lista contendo a interseco de duas outras listas
Montar uma nova lista contendo a unio de duas outras listas
Inserir um elemento depois do n-simo elemento da lista
Deletar o n-simo elemento de uma lista
Ordenar uma lista (segundo algum critrio)
Obs 1: A lista possui um apontador para o incio da mesma chamado Cabec e
um apontador para o ltimo elemento chamado Fim.
Obs 2: Caso voc tenha que trabalhar com mais de uma lista, crie mais alguns
nomes para especificar os incios e finais das mesmas (ex: Cabec1, Fim1, Cabec2,
Fim2, etc)
4.09) Utilizando a estrutura de dados baseada em apontadores utilizando um
vetor previamente alocado, reescreva os algoritmos do exerccio anterior.
Obs 1: A lista possui uma varivel indicando o incio da mesma (chamada
Cabec) e uma outra varivel referenciando o ltimo elemento (chamada Fim).
Tambm existe uma varivel chamada Livre indicando os espaos livres (como dado
em aula).
Obs 2: Caso voc tenha que trabalhar com mais de uma lista, crie mais alguns
nomes para especificar os incios e finais das mesmas (ex: Cabec1, Fim1, Cabec2,
Fim2, etc)