Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
maio/2017
Listas Lineares
Alocação Encadeada
Listas encadeadas:
- Conceitos
- Buscas/Inserções/deleções de elementos
- Pilhas e Filas
- Listas Circulares e Listas Duplamente
Encadeadas
Listas Lineares
Alocação Encadeada
Conceito:
Listas encadeadas são listas onde os elementos
consecutivos podem não ocupar posições consecu-
tivas na memória. Então há um ponteiro para o
próximo elemento da lista.
Representação:
Link Inicial
E M F A R
Alocação Encadeada
Declaração em Pascal:
Type lista = no;
no = Record c: char; prox: lista; End;
Declaração em C/C++:
typedef struct node *lista;
struct node { char c; lista prox;}
Link Nulo:
, Nulo, Nil (Pascal), NULL (C/C++).
Listas Lineares
Alocação Encadeada
Alocação de um nó:
Alocar (p);
New(p); (Pascal)
lista p = malloc(sizeof *p); (C). p = new(no); (C++).
Desalocação de um nó:
Desalocar (p); Dispose(p); (Pascal); free(p); (C/C++).
Alocação Encadeada
p F A
Outras referências:
p.prox.c A
p.prox.prox A
Listas Lineares
Alocação Encadeada
Nó cabeça:
É comum utilizar o primeiro nó como nó especial,
ou nó cabeça.
cab
E R M
Nó retaguarda:
Às vezes usa-se também um nó especial no final.
cab
ret
E R M
Listas Lineares
Alocação Encadeada
E R M
Alocação Encadeada
Alocação Encadeada
Alocação Encadeada
Três maneiras de criar a lista abaixo:
cab
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
Fim;
Alg2:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; cab.prox p;
Alocar(p); p.c 3; cab.prox.prox p; p.prox Nulo;
Fim;
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
Fim;
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
? ? ? ....
101-200
....
201-300
....
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 ? ? ....
101-200
....
201-300
....
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 ? ? ....
101-200
....
201-300
.... 1
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 50 ? ....
101-200
....
201-300
.... 1
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 50 ? 2 ....
101-200
....
201-300
.... 1
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 50 493 2 ....
101-200
....
201-300
.... 1
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 50 493 2 ....
101-200
....
201-300
.... 1
301-400
....
401-500
.... 3
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 50 493 2 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
.... 3
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 50 493 2 493 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
.... 3
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg1:
Alocar(cab); cab.c 1; Alocar(p); p.c 2; Alocar(q); q.c 3;
cab.prox p; p.prox q; q.prox Nulo;
cab p q
1-100
277 50 493 2 493 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
.... 3 0
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
? ? ....
101-200
....
201-300
....
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 ? ....
101-200
....
201-300
....
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 277 ....
101-200
....
201-300
....
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 277 ....
101-200
....
201-300
.... 1
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 277 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 50 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 50 2 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 50 2 493 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 493 2 493 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
....
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 493 2 493 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
.... 3
Listas Lineares
cab
Alocação Encadeada
1 2 3
Alg3:
Alocar(cab); p cab; p.c 1; Alocar(p.prox); p p.prox;
p.c 2; Alocar(p.prox); p p.prox; p.c 3; p.prox Nulo;
cab p
1-100
277 493 2 493 ....
101-200
....
201-300
.... 1 50
301-400
....
401-500
.... 3 0
Listas Lineares
Alocação Encadeada
Duas maneiras de criar a lista abaixo, com n nós:
cab
1 2 ... n
Cria1: #Dados: inteiro n
Para i de 1 a n:
Alocar(p); p.c i;
Se (i = 1) Então cab p
Senão q.prox p;
q p;
p.prox Nulo;
Fim;
Cria2: #Dados: inteiro n
Alocar(cab); p cab; p.c 1;
Para i de 2 a n:
Alocar(p.prox); p p.prox; p.c i;
p.prox Nulo;
Fim;
Listas Lineares
Alocação Encadeada
Exercício: explicar o que faz o seguinte algori-
tmo, em relação a uma lista encadeada sem nó
cabeça: cab
B P V J
cab r;
Fim;
Listas Lineares
Alocação Encadeada
Três maneiras de inverter uma lista encadeada
Primeira: usar o algoritmo do exercício anterior, que só faz
alteração em links.
p cab;
Enquanto (p Nulo);
v POP (); p.c v;
p p.prox;
Fim;
Listas Lineares
Alocação Encadeada
Três maneiras de inverter uma lista encadeada
Terceira: usar o algoritmo abaixo, que empilha os links na pilha S e
depois desempilha, alterando as ligações entre os nós.
POP(p); cab p;
Enquanto (topo 0);
p.prox S[topo];
p POP();
p.prox; Nulo;
Fim;
Listas Lineares
Alocação Encadeada
Busca em uma lista encadeada:
cab
E R M
Retornar pont;
Fim;
Listas Lineares
Alocação Encadeada
Busca em uma lista encadeada ordenada:
cab
E M R
Alocação Encadeada
Inserção em uma lista encadeada não ordenada:
cab
E M R
G
Listas Lineares
Alocação Encadeada
Inserção em uma lista encadeada não ordenada:
cab
E M R
Alocação Encadeada
Inserção em uma lista encadeada ordenada:
cab
E M R
G
Listas Lineares
Alocação Encadeada
Inserção em uma lista encadeada ordenada:
cab
E M R
Alocação Encadeada
Remoção em uma lista encadeada ordenada:
cab
E M R
Listas Lineares
Alocação Encadeada
Remoção em uma lista encadeada ordenada:
cab
E R
M
Alocação Encadeada
Exercício: escrever um algoritmo para transfor-
mar um número inteiro pequeno para a represen-
tação de inteiro grande, em uma lista encadeada.
4 9 5 3
Listas Lineares
Alocação Encadeada
Exercício: escrever um algoritmo para transformar um número
inteiro para a representação de inteiro grande, em uma lista
encadeada.
Ex: o número 3594 seria representado como:
cab
4 9 5 3
p.prox Nulo;
Fim;
Listas Lineares
Alocação Encadeada
Exercício: escrever um algoritmo somar 2 grandes
números representados em listas encadeadas.
cab1
7 1
cab2
4 8 9 9
Listas Lineares
Alocação Encadeada
Solução
cab3
1 0 0 0 1
Soma: #Dados: listas cab1 e cab2, com nós cabeça
p cab1.prox; q cab2.prox; v1 0;
Alocar(r); cab3 r;
Enquanto ((p Nulo) Ou (q Nulo) Ou (v1 0)):
Se (p Nulo) Então
v1 v1 + p.c; p p.prox;
Se (q Nulo) Então
v1 v1 + q.c; q q.prox;
Alocar(r.prox ); r r.prox;
r.c v1 mod 10; v1 v1 div 10;
r.prox Nulo;
Fim;
Listas Lineares
Alocação Encadeada
Exercício: escrever um algoritmo multiplicar um número pe-
queno por um número grande representado em listas enca-
deadas.
cab1
7 1 x 156
cab2
2 5 6 2
Listas Lineares
Alocação Encadeada
Solução
q.prox Nulo;
Fim;
Listas Lineares
Alocação Encadeada
Pilhas como listas encadeadas:
Esvazia:
topo Nil; topo
Fim;
PUSH(k):
Alocar(p); 4
p.c k; p.prox topo; topo p;
Retornar topo;
Fim; 9
POP():
Se (topo Nulo) Então;
p topo; k p.c; 5
topo topo.prox; Desalocar(p);
Senão
k Nulo;
3
Retornar k;
Fim;
Listas Lineares
Alocação Encadeada
Filas como listas encadeadas:
f r
4 9 5 3
Enfila(k): Esvazia:
Alocar(p); p.c k; p.prox Nulo; f Nil; r Nil;
Se (r Nulo) Então Fim;
r.prox p
Senão
f p;
r p;
Fim;
Desenfila():
Se (f Nulo) Então;
p f; k p.c; f f.prox; Desalocar(p);
Se (f = Nulo) Então
r Nulo;
Senão
k Nulo;
Retornar k;
Fim;
Listas Lineares
Alocação Encadeada
Ordenação por distribuição:
Alocação Encadeada
Ordenação por distribuição - Exemplo
f10 r10
Alocação Encadeada
Ordenação por distribuição - Exemplo Passo 1 -
Distribuição segundo o dígito 1.
f10 r10
Fila 1: 981
Fila 9: 209
Listas Lineares
Alocação Encadeada
Ordenação por distribuição - Exemplo
f10 r10
Alocação Encadeada
Ordenação por distribuição - Exemplo Passo 2 -
Distribuição segundo o dígito 2.
f10 r10
Fila 1: 116
Fila 6: 266
Fila 7: 472
Fila 8: 981
Listas Lineares
Alocação Encadeada
Ordenação por distribuição - Exemplo
f10 r10
Alocação Encadeada
Ordenação por distribuição - Exemplo Passo 3 -
Distribuição segundo o dígito 3.
f10 r10
Fila 0: 002
Fila 1: 116
Fila 3: 353
Fila 9: 981
Listas Lineares
Alocação Encadeada
Ordenação por distribuição - Exemplo
Alocação Encadeada
Ordenação por distribuição:
Para j de 0 até 9:
Enquanto (Filas[j].f Nulo):
p Desenfila (j); Enfila (10, p);
Fim;
Complexidade: (n.nd)
Listas Lineares
Alocação Encadeada
Análise da Ordenação por Distribuição:
Complexidade:
Pior caso = Melhor caso: (n.nd)
Alocação Encadeada
Listas circulares:
cab
B M X C
Alocação Encadeada
Listas Duplamente Encadeadas Ordenadas:
cab
B C M X
Retornar pont;
Fim;
Listas Lineares
Alocação Encadeada
Listas Duplamente Encadeadas Ordenadas-
Inserção:
cab
B C M X
Alocação Encadeada
Listas Duplamente Encadeadas - Remoção:
cab
B C M X
Alocação Encadeada
Exercício: dado o grid encadeado:
a) escrever um algoritmo que soma todos os
números do grid
b) escrever um algoritmo que encontra o maior
elemento do grid.
cab
4 8 9 9
-3 17 1 0
15 6 -6 11
Listas Lineares
Alocação Encadeada
Exercício: dado o grid encadeado:
a) escrever um algoritmo que soma todos os
números do grid
Solução:
Soma(s): #Dados: lista cab
p cab; s 0;
Enquanto (p Nulo):
q p;
Enquanto (q Nulo):
s s + q.c; q q.proxh;
p p.proxv;
Fim;
Listas Lineares
Alocação Encadeada
Exercício: dado o grid encadeado:
b) escrever um algoritmo que encontra o maior
elemento do grid.
Solução:
Maior(max): lista cab
p cab; max -;
Enquanto (p Nulo):
q p;
Enquanto (q Nulo):
Se (q.c > max) Então max q.c;
q q.proxh;
p p.proxv;
Fim;
Listas Lineares
Fim