SlideShare a Scribd company logo
1 of 64
Download to read offline
Listas Lineares
Cristiano Pires Martins
Lista Linear
! É um conjunto de elementos do mesmo tipo
denominados nodos;
! Existe uma relação de ordem linear;
! Relacionamento entre os nodos é definido
pela sua posição em relação aos outros;
! Os nodos podem conter:
! Dados primitivos;
! Dado composto.
Lista Linear
! Toda lista linear apresenta um nodo que
encabeça a lista: primeiro nodo da lista;
! A partir do primeiro, existe uma sequência
até o último;
! Todo nodo apresenta outro nodo antes
(exceto o primeiro) e outro depois (exceto o
último);
! O número de nodos de uma lista é o
comprimento da lista.
Lista Linear
1o nodo 2o nodo
Último
nodo
Exemplos de Aplicações
! Notas de cada aluno de uma turma:
! A posição de cada aluno da lista depende
de qual informação é utilizada: RM,
número na turma;
! Cadastro de funcionários de uma empresa:
! Organizado pelo número de matrícula;
! Ou ordem de admissão.
! Dias da semana;
! Valores obtidos através de medições.
Estrutura Interna de Cada
Nodo
! Pode apresentar qualquer nível de
complexidade:
! Simples;
! Arranjo;
! Registro;
! Tipo Abstrato de Dados.
Definição Formal
! n = 0: lista vazia, apresenta zero nodos
! n > 0: x1 é o primeiro nodo
! xn é o último nodo
! 1 < k < n: xk é precedido por xk-1 e sucedido
por xk+1
!
Tipo de Armazenamento na
Memória
! De acordo com o tipo de armazenamento na
memória, uma lista pode ser classificada
como:
! Alocação Sequencial (Contiguidade
Física);
! Alocação Encadeada.
Alocação Sequencial
! Quando o espaço de armazenamento na
memória é contíguo;
! Ponteiros Constantes (Vetores e Matrizes).
i+0
•
i+1
•
i+2
•
i+3
•
…
•
i+n
•
vetor
Alocação Sequencial
Nodo 1 Nodo 2 Nodo 3
Chave Nome Endereço
! Cada nodo é formado por campos que
armazenam as características distintas dos
elementos da lista.
! Além desses campos o nodo possui um
identificador que é chamado “chave”.
! Não existem dois nodos com a mesma chave
em uma lista.
! Os nodos podem ou não estarem ordenados
pelas suas chaves.
Alocação Encadeada
! Quando o espaço de armazenamento na
memória não é contíguo.
! Ponteiros Variáveis
Memória
1
2
3
Endereço de Memória
Listas Lineares usando Vetores
(contiguidade física)
! Cada elemento do vetor representa um nodo
da lista;
! Qualquer nodo pode ser acessado
diretamente através do índice do vetor
(arranjo);
! Não é necessário percorrer toda a lista para
desde o início;
! Todos os elementos da lista apresentam o
mesmo tipo de dado.
Lista Linear Implementada
Através de um Vetor
L1 L2 L3 L4 L5 L6
L1 L2 L3 L4 L5 L6
Operações Mais Frequentes
com Listas Lineares
! Busca;
! Inserção;
! Remoção.
Casos Especiais de Operações
com Listas Lineares
! Inserções e Remoções nas duas
extremidades são chamados de deques
(Doublé ENDed Queve).
! Inserções e Remoções em apenas uma das
extremidades: pilhas.
! Inserções em uma das extremidades e
Remoções na outra extremidade: fila.
Operações Sobre 

Listas Lineares
! Listas lineares, como quaisquer TADs
precisam definir as operações que podem ser
realizadas sobre elas:
! Operações básicas sobre listas lineares:
! Criação de uma lista;
! Inserção de um nodo;
! Exclusão de um nodo;
! Acesso a um nodo;
! Destruição de uma lista.
! Essas são somente as operações básicas,
mas outras podem ser necessárias.
Criação de uma lista
! É a primeira operação a ser executada;
! Aloca as variáveis necessárias para a
definição da lista;
! Inicializa as variáveis de controle;
! Por fim as demais operações ficam
habilitadas.
17
Inserção de um Nodo
! Formar a lista;
! Inserir nodo a nodo;
! Inserções podem ser:
! No início da lista;
! No final da lista;
! Em alguma posição dentro da lista.
18
Listas Lineares Utilizando
Vetor (Arranjo)
! Todos os elementos de um Arranjo
apresentam o mesmo tipo de dados;
! Esse tipo de dado representa o conjunto de
informações;
! Exemplo:
19
TipoNodo = registro
Nome : string
Código : inteiro
Valor : real
Fim registro
TipoLista = arranjo [1..N] de TipoNodo
Inserção de um Novo Nodo
! Inserção como primeiro nodo da lista;
! Inserção como último nodo da lista;
! Inserção no meio da lista.
20
Algoritmo de
Inserção no Início
da Lista
21
Entradas:
LL (TipoLista)
IA, FA, IL, FL (inteiro)
InfoNodo (TipoNodo)
Saídas:
LL (TipoLista)
IL, FL (inteiro)
Sucesso (lógico)
Var. auxiliar : Ind (inteiro)
início
se (IA = IL) e (FA = FL) então
Sucesso ← falso
senão início
se IL = 0 então
IL ← FL ← IA
senão se IL > IA então
IL ← IL-1
senão
início {Deslocar nodos para cima}
para Ind de FL incr -1 até IL faça
LL[Ind+1] ← LL[Ind]
FL ← FL+1
fim
LL[IL] ← infoNodo
Sucesso ← verdadeiro
fim
fim
IA FA
Algoritmo de
Inserção no Fim
da Lista
22
Entradas:
LL (TipoLista)
IA, FA, IL, FL (inteiro)
InfoNodo (TipoNodo)
Saídas:
LL (TipoLista)
IL, FL (inteiro)
Sucesso (lógico)
Var. auxiliar : Ind (inteiro)
início
se (IA = IL) e (FA = FL) então
Sucesso ← falso
senão início
se IL = 0 então
IL ← FL ← IA
senão se FL < FA então
FL ← FL+1
senão
início {Deslocar nodos para cima}
para Ind de IL incr 1 até FL faça
LL[Ind-1] ← LL[Ind]
IL ← IL-1
fim
LL[FL] ← infoNodo
Sucesso ← verdadeiro
fim
fim
IA FA
23
início
se (IA = IL e FA = FL) ou (K > FL-IL+2) ou (k<=0) ou (IL=0 e K ≠ 1) então
Sucesso ← falso
senão início
se IL = 0 então {Lista Vazia}
IL ← FL ← IA
senão se FL < FA então {Tem espaço no fim}
início {Deslocar nodos para direita}
para Ind de FL incr -1 até IL+K-1 faça
LL[Ind+1] ← LL[Ind]
FL ← FL + 1
fim
senão início {Deslocar nodos para esquerda}
para Ind de IL incr 1 até IL+K-1 faça
LL[Ind-1] ← LL[Ind]
IL ← IL-1
//k ← k+1
fim
LL[IL+K-1] ← infoNodo
Sucesso ← verdadeiro
fim
fim
Inserção no meio da Lista
Entradas:
LL (TipoLista)
IA, FA, IL, FL (inteiro)
K (inteiro)
InfoNodo (TipoNodo)
Saídas:
LL (TipoLista)
IL, FL (inteiro)
Sucesso (lógico)
Variável auxiliar : Ind (inteiro)
IA FA
24
início
se (IA = IL e FA = FL) ou (K > FL-IL+2) ou (k<=0) ou (k>FA)
então
Sucesso ← falso
senão início
se IL = 0 então {Lista Vazia}
IL ← FL ← (FA+1) div 2 {Insere no meio}
senão se IL = IA ou ((FL < FA) e (K>(FL-IL+2)/2)) então
início {Deslocar nodos para direita}
para Ind de FL incr -1 até IL+K-1 faça
LL[Ind+1] ← LL[Ind]
FL ← FL + 1
fim
senão início {Deslocar nodos para esquerda}
para Ind de IL incr 1 até IL+K-1 faça
LL[Ind-1] ← LL[Ind]
IL ← IL-1
k ← k+1
fim
LL[IL+K-1] ← infoNodo
Sucesso ← verdadeiro
fim
fim
Inserção no meio da Lista Otimizado
Entradas:
LL (TipoLista)
IA, FA, IL, FL (inteiro)
K (inteiro)
InfoNodo (TipoNodo)
Saídas:
LL (TipoLista)
IL, FL (inteiro)
Sucesso (lógico)
Variável auxiliar : Ind
(inteiro)
IA FA
25
início
se (K<=0) ou (K>FL-IL+1) então
Sucesso ← falso
senão
início
para Ind de IL+K-1 incr 1 até FL faça
LL[Ind] ← LL[Ind+1]
FL ← FL-1
se FL = IL-1 então
IL ← FL ← 0
Sucesso ← verdadeiro
fim
fim
Remoção de um Nodo
Entradas:
LL (TipoLista)
IA, FA, IL, FL
(inteiro)
K (inteiro)
InfoNodo (TipoNodo)
Saídas:
LL (TipoLista)
IL, FL (inteiro)
Sucesso (lógico)
Variável auxiliar : Ind
(inteiro)
IA FA
Acesso ao Nodo Identificado
por sua Ordem na Lista
26
Entradas: LL (TipoLista)
IL,FL (inteiro)
K (inteiro)
Saída: InfoNodo (TipoNodo)
Sucesso (lógico)
início
se (K <= 0) ou (K > FL-IL+1) ou (IL = 0) então
Sucesso ← falso
senão início
InfoNodo ← LL[IL+K-1]
Sucesso ← verdadeiro
fim
fim
IA FA
Acesso a Nodo Identificado
através de Seu Conteúdo
27
TipoNodo = registro
Valor : inteiro
Info : TipoInfo
fim registro
início
Achou ← falso
Posição ← 0
I ← IL
enquanto (I <= FL) e (não achou) faça
se LL[I].Valor = ValBuscado então
início
Posição ← (I-IL+1)
Achou ← verdadeiro
fim
senão
I ← I + 1
retorna posição
fim
Entradas:
LL (TipoLista)
IL, FL (inteiro)
ValBuscado (TipoNodo)
Saídas:
Posição (inteiro)
Variáveis auxiliares :
Achou (lógico)
IA FA
Acesso a Nodo identificado
através do conteúdo ordenado
28
início
Achou ← falso
Posição ← 0
Inf ← IL
Sup ← FL
enquanto (Inf<=Sup) e (não Achou) faça
início
Meio ← (Inf+Sup) div 2
se LL[Meio].Valor = ValorBuscado então
início
Posição ← Meio
Achou ← verdadeiro
fim
senão se LL[Meio].Valor < ValBuscado então
Inf ← Meio+1
senão
Sup ← Meio-1
fim
retorna posição
fim
Entradas:
LL (TipoLista)
IL, FL (inteiro)
ValBuscado (TipoNodo)
Saídas:
Posição (inteiro)
Variáveis auxiliares :
Meio, Inf, Sup (inteiro)
Achou (lógico)
IA FA
Trabalho
! Faça um programa que contenha todos os
algoritmos mostrados até agora.
! Crie uma função para cada um.
! Crie um menu para que o usuário possa
escolher uma dessas opções.
! Crie uma função para ordenar a lista antes
de fazer a busca em lista ordenada.
29
Listas Lineares Encadeadas
! Estrutura de Dados que cresce e diminui
quando nodos são inseridos ou excluídos;
! São denominados estruturas dinâmicas;
! Armazenam cada nodo da lista por alocação
dinâmica de memória;
! Uma das formas de implementação de
estrutura dinâmica é através de
encadeamento.
30
Listas Lineares Encadeadas
! A ordem dos nodos é definida por uma
informação contida no próximo nodo;
! Essa informação está no: “campo elo”;
! Podem estar alocados em qualquer posição
da memória, contígua ou não;
! A contiguidade de uma lista linear encadeada
é lógica.
31
Listas Lineares Encadeadas
! Para implementar uma lista, utiliza-se
ponteiros;
! A aplicação não tem acesso direto ao
endereço contido no ponteiro;
! Mas permite que este endereço seja testado
e utilizado para alcançar o próximo da lista;
! O espaço total de memória gasto pela
estrutura é proporcional ao número de nodos
armazenados na lista.
32
Uma Lista Linear Encadeada
deve apresentar
! Um ponteiro para o primeiro nodo da lista.
! Assim é feito o acesso à lista;
! Pode ser uma variável simples do tipo do
ponteiro ou uma estrutura (registro).
! Encadeamento entre os nodos, através de
algum campo de elo;
! Uma indicação de final da lista (nulo).
33
Exemplo de um tipos de
dados que serão utilizados
34 TipoPtNodo = ↑TipoNodo
TipoNodo = registro
Info: TipoInfoNodo
Elo : TipoPtNodo
fim registro
Criação de Uma Lista Linear
Encadeada
35
Entradas: -
Saída: PtLista (TipoPtNodo)
início
PtLista ← nulo
fim
Inserção de um Novo Nodo
! Para inserir um novo nodo em uma lista
encadeada deve:
! alocar um novo nodo;
! preenchê-lo com o valor correspondente.
! Caso não consiga alocar um novo nodo e
preenchê-lo por falta de espaço físico, avise
ao usuário;
! Insira o nodo na posição indicada na lista;
! Para isso, precisa adequar os campo “elo” do
nodo anterior.
36
Inserção no início da lista
encadeada
37
Novo nodo
PtLista
L1 L2 L3
PtLista
L2 L3 L4L1
Inserção no início da lista
encadeada
38
Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variável auxiliar: PtNovo (TipoPtNodo)
início
alocar (PtNovo)
se PtNovo = nulo então
Sucesso ← falso
senão
início
PtNovo↑.Info ← Dados
PtNovo↑.Elo ← PtLista
PtLista ← PtNovo
Sucesso ← verdadeiro
fim
fim
Inserção no final da lista
encadeada
39
PtLista
L1 L2 L3
PtLista
L2 L3 L4L1
Novo nodo
Inserção no final da lista
encadeada
40
início
alocar (PtNovo)
se PtNovo = nulo então
Sucesso ← falso
senão
início
PtNovo↑.Info ← Dados
PtNovo↑.Elo ← nulo
se PtLista = nulo então
PtLista ← PtNovo
senão
PtAux ← PtLista
enquanto PtAux↑.Elo ≠ nulo faça
PtAux ← PtAux↑.Elo
PtAux↑.Elo ← PtNovo
fim
Sucesso ← verdadeiro
fim
fim
Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtNovo, PtAux (TipoPtNodo)
Inserção no meio da lista
encadeada
41
PtLista
L1 L2 L3
PtLista
L2
L3
L4L1
Novo nodo
42
início
alocar (PtNovo)
se PtNovo = nulo então
Sucesso ← falso
senão se ((PtLista = nulo) e (K ≠ 1)) ou (K < 1) então início {primeiro nó da
lista}
liberar(PtNovo) {Não foi possível inserir, libera o novo nó}
Sucesso ← falso
fim
senão se k = 1 então início
PtNovo↑.Info ← Dados
PtNovo↑.Elo ← PtLista
PtLista ← PtNovo
Sucesso ← verdadeiro
fim
senão início
PtAnt ← PtLista
enquanto (PtAnt↑.Elo ≠ nulo) e (k>2) faça início
PtAnt ← PtAnt↑.Elo
K ← K - 1
fim
se K > 2 então início
liberar (PtNovo)
Sucesso ← falso
fim
senão início
PtNovo↑.Info ← Dados
PtNovo↑.Elo ← PtAnt↑.Elo
PtAnt↑.Elo ← PtNovo
Sucesso ← verdadeiro
fim
fim
Inserção no meio da lista encadeada
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PAnt, PtNovo
(TipoPtNodo)
PtLista
L1 L2 L3 nulo
43
início
se K < 1 então
Sucesso ← falso
senão início
PtK ← PtLista
PtAnt ← nulo
enquanto (PtK ≠ nulo) e (K > 1) faça início
K ← K -1
PtAnt ← PtK
PtK ← PtK↑.Elo
fim
se PtK = nulo então
Sucesso ← falso
senão início
se PtK = PtLista então
PtLista ← Ptk↑.Elo
senão
PtAnt↑.Elo ← PtK↑.Elo
liberar(PtK)
Sucesso ← verdadeiro
fim
fim
fim
Remoção de um Nodo
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtAnt, PtK
(TipoPtNodo)
PtLista
L1 L2 L3 nulo
Acesso a um Nodo
44
início
se (K<1) ou (PtLista = nulo) então
PtK ← nulo
senão início
PtK ← PtLista
enquanto (PtK ≠ nulo) e (K>1) faça início
K ← K-1
PtK ← PtK↑.Elo
fim
se K > 1 então
PtK ← nulo
fim
retorna PtK
fim
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Saídas: PtK:(tipoPtNodo)
PtLista
L1 L2 L3 nulo
45
Destruição de uma Lista Linear Encadeada
início
enquanto PtLista ≠ nulo faça início
PtRemover ← PtLista
PtLista ← PtRemover↑.Elo
liberar (PtRemover)
fim
liberar (PtLista)
fim
Entradas: PtLista (TipoPtNodo)
Saídas: PtLista:(tipoPtNodo)
Variável Auxiliar: PtRemover (TipoPtNodo)
PtLista
L1 L2 L3 nulo
Trabalho
! Implementar um programa com menu para
as opções de uma lista encadeada:
! Inserção no início;
! Inserção no fim;
! Inserção no meio;
! Remoção;
! Acesso a um nó;
! Destruição.
! Implemente da mesma forma utilizada para
inserção em Lista Linear usando Vetor.
46
Lista Encadeada Circular
! Apresenta uma lista linear encadeada ligando
o último nodo ao primeiro.
47
PtLista
L1 L2 L3
48
início
alocar (PtNovo)
se PtNovo = nulo então
Sucesso ← falso
senão se ((PtLista = nulo) e (K ≠ 1)) ou (K < 1) então início
liberar(PtNovo) {Não foi possível inserir, libera o novo nó}
Sucesso ← falso
fim
senão início
Sucesso ← verdadeiro
PtNovo↑.Info ← Dados
se k = 1 então início
se PtLista = nulo então
PtNovo↑.Elo ← PtNovo
senão início
PtAnt ← PtLista
enquanto (PtAnt↑.Elo ≠ PtLista) faça
PtAnt ← PtAnt.Elo
PtNovo↑.Elo ← PtLista
PtAnt↑.Elo ← PtNovo
fim
PtLista ← PtNovo
fim
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PAnt,
PtNovo (TipoPtNodo)
Inserção de um Novo Nodo
PtLista
L1 L2 L3
Inserção de um Novo Nodo
49
senão início
PtAnt ← PtLista
enquanto (PtAnt↑.Elo ≠ PtLista) e (K > 2) faça
início
PtAnt ← PtAnt↑.Elo
K ← K - 1
fim
se (k > 2) então início
liberar(PtNovo)
Sucesso ← falso
fim
senão início
PtNovo↑.Info ← Dados {INSERE NO MEIO}
PtNovo↑.Elo ← PtAnt↑.Elo
PtAnt↑.Elo ← PtNovo
fim
fim
fim
fim
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PAnt,
PtNovo (TipoPtNodo)
Inserção de um Novo Nodo
PtLista
L1 L2 L3
50
início
se (K < 1) ou (PtLista=nulo) então
Sucesso ← falso
senão início
Sucesso ← verdadeiro
se K = 1 então
se PtLista↑.Elo = PtLista então início
liberar(PtLista)
PtLista ← nulo
fim
senão início
PtAnt ← PtLista
enquanto PtAnt↑.Elo ≠ PtLista faça
PtAnt ← PtAnt↑.Elo
PtAnt↑.Elo ← PtLista↑.Elo
Liberar (PtLista)
PtLista ← PtAnt↑.Elo
fim
senão início
PtAnt ← PtLista
enquanto (PtAnt↑.Elo ≠ PtLista) e (K > 2) faça início
PtAnt ← PtAnt↑.Elo
K ← K -1
fim
se PtAnt↑.Elo = PtLista então {ORDEM FORA DA LISTA}
Sucesso ← falso
senão início
PtK ← PtAnt↑.Elo
PtAnt↑.Elo ← PtK↑.Elo
liberar (PtK)
fim
fim
fim
fim
Remoção de um Nodo
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtAnt, PtK
(TipoPtNodo)
PtLista
L1 L2 L3
51
Mostrar todos os Nodos da Lista
início
se PtLista = nulo então
escrever (‘Lista Vazia!’)
senão início
PtAux ← PtLista
repita
escrever(PtAux↑.Info)
PtAux ← PtAux↑.Elo
até que PtAux = PtLista
fim
fim
Entradas: PtLista (TipoPtNodo)
Saídas: -
Variável Auxiliar: PtAux (TipoPtNodo)
PtLista
L1 L2 L3
Listas Lineares Duplamente
Encadeadas
! Permite que a lista seja percorrida nos dois
sentidos;
! Apresenta 2 campos de elo (anterior e
próximo);
! O primeiro anterior aponta para nulo assim
como o último próximo
52
PtLista
L1 L2 L3 nulonulo
Listas Lineares Duplamente
Encadeadas
InfoAnt Próx
Nodo Genérico
TipoNodo = registro
Ant : TipoPtNodo
Info: TipoInfoNodo
Próx: TipoPtNodo
fim registro
PtLista
L1 L2 L3 nulonulo
Novo Nodo
PtLista
L1 L2 L4 nulonulo
Novo Nodo
L3
55
início
alocar (PtNovo)
se PtNovo = nulo então
Sucesso ← falso
senão se ((PtLista = nulo) e (K ≠ 1)) ou (K < 1) então início
liberar(PtNovo)
Sucesso ← falso
fim
senão se k = 1 então início
PtNovo↑.Info ← Dados
PtNovo↑.Prox ← PtLista
se PtLista ≠ nulo então
PtLista↑.Ant ← PtNovo
PtNovo↑.Ant ← nulo
PtLista ← PtNovo
Sucesso ← verdadeiro
fim
senão...
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PAnt, PtNovo
(TipoPtNodo)
Inserção de um Novo Nodo
PtLista
L1 nulonulo L2 L3
56
senão início
PtAnt ← PtLista
enquanto (PtAnt↑.Prox ≠ nulo) e (K > 2) faça início
PtAnt ← PtAnt↑.Prox
K ← K - 1
fim
se K > 2 então início
liberar(PtNovo)
Sucesso ← falso
fim
senão início
PtNovo↑.Info ← Dados
PtNovo↑.Prox ← PtAnt↑.Prox
PtNovo↑.Ant ← PtAnt
PtAnt↑.Prox ← PtNovo
se PtNovo↑.Prox ≠ nulo então
PtNovo↑.Prox↑.Ant ← PtNovo
Sucesso ← verdadeiro
fim
fim
fim
Inserção de um Novo Nodo
PtLista
L1 nulonulo L2 L3
57
início
se ((PtLista=nulo) ou (K < 1) então
Sucesso ← falso
senão início
PtK ← PtLista
enquanto (Ptk ≠ nulo) e (K > 1) faça início
K ← K - 1
PtK ← PtK↑.Prox
fim
se PtK = nulo então
Sucesso ← falso
senão início
sucesso ← verdadeiro
se PtK = PtLista então início
se PtLista↑.Prox = nulo
PtLista = nulo
senão início
PtLista↑.Prox↑.Ant ← nulo
PtLista ← PtLista↑.Prox
fim
fim
senão início
PtK↑.Ant↑.Prox ← PtK↑.Prox
se PtK↑.Prox ≠ nulo então
PtK↑.Prox↑.Ant ← PtK↑.Ant
fim
fim
liberar (PtK)
fim
fim
fim
Remoção de um Nodo
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtK (TipoPtNodo)
PtLista
L1 nulonulo L2 L3
58
Acesso à Lista Duplamente Encadeada
início
se PtLista = nulo então
escrever (‘Lista Vazia!’)
senão início
PtAux ← PtLista
enquanto PtAux↑.Prox ≠ nulo faça
PtAux ← PtAux↑.Prox
enquanto PtAux ≠ PtLista faça início
escrever(PtAux↑.Info)
PtAux ← PtAux↑.Ant
fim
escrever(PtAux↑.Info)
fim
fim
Entradas: PtLista (TipoPtNodo)
Saídas: -
Variável Auxiliar: PtAux (TipoPtNodo)
PtLista
L1 nulonulo L2 L3
Lista Duplamente Encadeada,
com Descritor
59
TipoDescrLDE = registro
Prim: TipoPtNodo
N : inteiro
Ult : TipoPtNodo
fim registro
PtDescrLDE
L1 nulonulo L2 L3
3
Prim UltN
Lista Duplamente Encadeada
Circular
! O último nodo tem o primeiro nodo como o
próximo;
! A lista pode ser percorrida em qualquer
sentido;
! O acesso à lista é sempre feito através de
seu primeiro nodo;
! Caso se conheça o número de nodos da
lista, é possível escolher o melhor sentido de
percurso, quando se quer inserir no meio ou
buscar um elemento;
60
61 PtLista
L1 L2 L3
Lista Duplamente Encadeada
Circular
! Diferenças da LDE e LDEC quanto à
implementação:
! Criar a lista é similar;
! A forma de acessar os nodos da lista é
pouco alterada: mudando somente no final
da lista quando o último nodo aponta para
o primeiro;
! O mesmo acontece com a destruição da
lista;
! Maiores alterações: inserção e remoção.
62
Lista Duplamente Encadeada
Circular LDEC
Inserção de um Novo Nodo
em uma LDEC
Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Saídas: PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtNovo
(TipoPtNodo)
PtLista
L1 L2 L3
64
início
se PtLista = nulo então
Sucesso ← falso
senão início
Sucesso ← verdadeiro
PtAux ← PtLista
se PtLista↑.Prox = PtLista então
PtLista ← nulo
senão
PtLista↑.Prox↑.Ant ← PtLista↑.Ant
PtLista↑.Ant↑.Prox ← PtLista↑.Prox
PtLista ← PtLista↑.Prox
fim
liberar(PtAux)
fim
fim
Remoção de um Nodo em
uma LDEC
Entradas: PtLista (TipoPtNodo)
Saídas : PtLista:(tipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtAux (TipoPtNodo)
PtLista
L1 L2 L3

More Related Content

What's hot

Manual-de-php
Manual-de-phpManual-de-php
Manual-de-phpdiogoa21
 
Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)
Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)
Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)Leinylson Fontinele
 
Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)
Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)
Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)Leinylson Fontinele
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL BásicoIgor Alves
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoRangel Javier
 
Banco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e EspecializaçãoBanco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e EspecializaçãoLeinylson Fontinele
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLDaniel Brandão
 
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com JavaExercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com JavaLoiane Groner
 
Aula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdfAula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdfMarcelo Silva
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADLeinylson Fontinele
 
Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)Janynne Gomes
 
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)Leinylson Fontinele
 
Banco de dados exercícios resolvidos
Banco de dados exercícios resolvidosBanco de dados exercícios resolvidos
Banco de dados exercícios resolvidosGleydson Sousa
 

What's hot (20)

Manual-de-php
Manual-de-phpManual-de-php
Manual-de-php
 
Visualg
VisualgVisualg
Visualg
 
Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)
Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)
Estrutura de Dados Aula 13 - Árvores (conceito, elementos, tipos e utilizações)
 
Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)
Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)
Banco de Dados II Aula 03 - Modelagem de Dados (Modelo Lógico)
 
Linguagem C - Ponteiros
Linguagem C - PonteirosLinguagem C - Ponteiros
Linguagem C - Ponteiros
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL Básico
 
Aula sobre Tabela Hash
Aula sobre Tabela HashAula sobre Tabela Hash
Aula sobre Tabela Hash
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL Basico
 
Banco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e EspecializaçãoBanco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e Especialização
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQL
 
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com JavaExercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
 
Aula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdfAula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdf
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
 
Apostila Oracle
Apostila OracleApostila Oracle
Apostila Oracle
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)
 
Análise de Algoritmos
Análise de AlgoritmosAnálise de Algoritmos
Análise de Algoritmos
 
Árvore Binária
Árvore BináriaÁrvore Binária
Árvore Binária
 
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
 
Banco de dados exercícios resolvidos
Banco de dados exercícios resolvidosBanco de dados exercícios resolvidos
Banco de dados exercícios resolvidos
 

Viewers also liked

Viewers also liked (20)

Aula 06 textos na web
Aula 06   textos na webAula 06   textos na web
Aula 06 textos na web
 
Aula 07 acessibilidade
Aula 07  acessibilidadeAula 07  acessibilidade
Aula 07 acessibilidade
 
Java script aula 07 - eventos
Java script   aula 07 - eventosJava script   aula 07 - eventos
Java script aula 07 - eventos
 
Java script aula 06 - dom
Java script   aula 06 - domJava script   aula 06 - dom
Java script aula 06 - dom
 
Java script aula 10 - angularjs
Java script   aula 10 - angularjsJava script   aula 10 - angularjs
Java script aula 10 - angularjs
 
Aula 08 - árvores
Aula 08 - árvoresAula 08 - árvores
Aula 08 - árvores
 
OAC Aula 09 - Entrada e Saída
OAC Aula 09 - Entrada e SaídaOAC Aula 09 - Entrada e Saída
OAC Aula 09 - Entrada e Saída
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
 
Java script aula 04 - objeto array
Java script   aula 04 - objeto arrayJava script   aula 04 - objeto array
Java script aula 04 - objeto array
 
Aula 02 semiótica e cores
Aula 02   semiótica e coresAula 02   semiótica e cores
Aula 02 semiótica e cores
 
Aula 05 layout e composição do site
Aula 05   layout e composição do siteAula 05   layout e composição do site
Aula 05 layout e composição do site
 
Aula 04 layout e composição do site
Aula 04   layout e composição do siteAula 04   layout e composição do site
Aula 04 layout e composição do site
 
Java script aula 03 - objetos
Java script   aula 03 - objetosJava script   aula 03 - objetos
Java script aula 03 - objetos
 
Java script aula 09 - JQuery
Java script   aula 09 - JQueryJava script   aula 09 - JQuery
Java script aula 09 - JQuery
 
WDI - aula 07 - css com html
WDI - aula 07 - css com htmlWDI - aula 07 - css com html
WDI - aula 07 - css com html
 
Java script aula 07 - j-query
Java script   aula 07 - j-queryJava script   aula 07 - j-query
Java script aula 07 - j-query
 
Aula 01-oac-introducao-a-oac
Aula 01-oac-introducao-a-oacAula 01-oac-introducao-a-oac
Aula 01-oac-introducao-a-oac
 
Aula 05-entrada e-saida
Aula 05-entrada e-saidaAula 05-entrada e-saida
Aula 05-entrada e-saida
 
Aula 08-oac-execucao-de-programas
Aula 08-oac-execucao-de-programasAula 08-oac-execucao-de-programas
Aula 08-oac-execucao-de-programas
 
Aula 01-introducao-ao-so
Aula 01-introducao-ao-soAula 01-introducao-ao-so
Aula 01-introducao-ao-so
 

Similar to Aula 07 - lista linear

Similar to Aula 07 - lista linear (12)

Lpiii dp-apostila
Lpiii dp-apostilaLpiii dp-apostila
Lpiii dp-apostila
 
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
 
Pilha e Fila Dinamica
Pilha e Fila DinamicaPilha e Fila Dinamica
Pilha e Fila Dinamica
 
Lista Duplamente Encadeada
Lista Duplamente EncadeadaLista Duplamente Encadeada
Lista Duplamente Encadeada
 
Estrutura de Dados
Estrutura de DadosEstrutura de Dados
Estrutura de Dados
 
Usar explicação 01
Usar explicação 01Usar explicação 01
Usar explicação 01
 
Usar explicação 01
Usar explicação 01Usar explicação 01
Usar explicação 01
 
Top0
Top0Top0
Top0
 
Top0
Top0Top0
Top0
 
Listas em C
Listas em CListas em C
Listas em C
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - FilasEstrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
 

More from Cristiano Pires Martins (13)

Aula 08 - árvores
Aula 08 - árvoresAula 08 - árvores
Aula 08 - árvores
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
 
Aula 01 introdução
Aula 01   introduçãoAula 01   introdução
Aula 01 introdução
 
Aula 03 esquema de cores
Aula 03   esquema de coresAula 03   esquema de cores
Aula 03 esquema de cores
 
Aula 07-oac-processadores
Aula 07-oac-processadoresAula 07-oac-processadores
Aula 07-oac-processadores
 
Aula 06-oac-memoria-principal
Aula 06-oac-memoria-principalAula 06-oac-memoria-principal
Aula 06-oac-memoria-principal
 
Aula 05-oac-conceitos-de-logica-digital
Aula 05-oac-conceitos-de-logica-digitalAula 05-oac-conceitos-de-logica-digital
Aula 05-oac-conceitos-de-logica-digital
 
Aula 03-oac-componentes-de-um-sistema-de-computacao
Aula 03-oac-componentes-de-um-sistema-de-computacaoAula 03-oac-componentes-de-um-sistema-de-computacao
Aula 03-oac-componentes-de-um-sistema-de-computacao
 
Aula 02-oac-historia-da-computacao-part2
Aula 02-oac-historia-da-computacao-part2Aula 02-oac-historia-da-computacao-part2
Aula 02-oac-historia-da-computacao-part2
 
Aula 02-oac-historia-da-computacao-part1
Aula 02-oac-historia-da-computacao-part1Aula 02-oac-historia-da-computacao-part1
Aula 02-oac-historia-da-computacao-part1
 
Aula 10-oac-arquitetura-risc
Aula 10-oac-arquitetura-riscAula 10-oac-arquitetura-risc
Aula 10-oac-arquitetura-risc
 
Aula 06-sistemas de-arquivo
Aula 06-sistemas de-arquivoAula 06-sistemas de-arquivo
Aula 06-sistemas de-arquivo
 
Aula 04-gerenciamento-basico-de-memoria
Aula 04-gerenciamento-basico-de-memoriaAula 04-gerenciamento-basico-de-memoria
Aula 04-gerenciamento-basico-de-memoria
 

Aula 07 - lista linear

  • 2. Lista Linear ! É um conjunto de elementos do mesmo tipo denominados nodos; ! Existe uma relação de ordem linear; ! Relacionamento entre os nodos é definido pela sua posição em relação aos outros; ! Os nodos podem conter: ! Dados primitivos; ! Dado composto.
  • 3. Lista Linear ! Toda lista linear apresenta um nodo que encabeça a lista: primeiro nodo da lista; ! A partir do primeiro, existe uma sequência até o último; ! Todo nodo apresenta outro nodo antes (exceto o primeiro) e outro depois (exceto o último); ! O número de nodos de uma lista é o comprimento da lista.
  • 4. Lista Linear 1o nodo 2o nodo Último nodo
  • 5. Exemplos de Aplicações ! Notas de cada aluno de uma turma: ! A posição de cada aluno da lista depende de qual informação é utilizada: RM, número na turma; ! Cadastro de funcionários de uma empresa: ! Organizado pelo número de matrícula; ! Ou ordem de admissão. ! Dias da semana; ! Valores obtidos através de medições.
  • 6. Estrutura Interna de Cada Nodo ! Pode apresentar qualquer nível de complexidade: ! Simples; ! Arranjo; ! Registro; ! Tipo Abstrato de Dados.
  • 7. Definição Formal ! n = 0: lista vazia, apresenta zero nodos ! n > 0: x1 é o primeiro nodo ! xn é o último nodo ! 1 < k < n: xk é precedido por xk-1 e sucedido por xk+1 !
  • 8. Tipo de Armazenamento na Memória ! De acordo com o tipo de armazenamento na memória, uma lista pode ser classificada como: ! Alocação Sequencial (Contiguidade Física); ! Alocação Encadeada.
  • 9. Alocação Sequencial ! Quando o espaço de armazenamento na memória é contíguo; ! Ponteiros Constantes (Vetores e Matrizes). i+0 • i+1 • i+2 • i+3 • … • i+n • vetor
  • 10. Alocação Sequencial Nodo 1 Nodo 2 Nodo 3 Chave Nome Endereço ! Cada nodo é formado por campos que armazenam as características distintas dos elementos da lista. ! Além desses campos o nodo possui um identificador que é chamado “chave”. ! Não existem dois nodos com a mesma chave em uma lista. ! Os nodos podem ou não estarem ordenados pelas suas chaves.
  • 11. Alocação Encadeada ! Quando o espaço de armazenamento na memória não é contíguo. ! Ponteiros Variáveis Memória 1 2 3 Endereço de Memória
  • 12. Listas Lineares usando Vetores (contiguidade física) ! Cada elemento do vetor representa um nodo da lista; ! Qualquer nodo pode ser acessado diretamente através do índice do vetor (arranjo); ! Não é necessário percorrer toda a lista para desde o início; ! Todos os elementos da lista apresentam o mesmo tipo de dado.
  • 13. Lista Linear Implementada Através de um Vetor L1 L2 L3 L4 L5 L6 L1 L2 L3 L4 L5 L6
  • 14. Operações Mais Frequentes com Listas Lineares ! Busca; ! Inserção; ! Remoção.
  • 15. Casos Especiais de Operações com Listas Lineares ! Inserções e Remoções nas duas extremidades são chamados de deques (Doublé ENDed Queve). ! Inserções e Remoções em apenas uma das extremidades: pilhas. ! Inserções em uma das extremidades e Remoções na outra extremidade: fila.
  • 16. Operações Sobre 
 Listas Lineares ! Listas lineares, como quaisquer TADs precisam definir as operações que podem ser realizadas sobre elas: ! Operações básicas sobre listas lineares: ! Criação de uma lista; ! Inserção de um nodo; ! Exclusão de um nodo; ! Acesso a um nodo; ! Destruição de uma lista. ! Essas são somente as operações básicas, mas outras podem ser necessárias.
  • 17. Criação de uma lista ! É a primeira operação a ser executada; ! Aloca as variáveis necessárias para a definição da lista; ! Inicializa as variáveis de controle; ! Por fim as demais operações ficam habilitadas. 17
  • 18. Inserção de um Nodo ! Formar a lista; ! Inserir nodo a nodo; ! Inserções podem ser: ! No início da lista; ! No final da lista; ! Em alguma posição dentro da lista. 18
  • 19. Listas Lineares Utilizando Vetor (Arranjo) ! Todos os elementos de um Arranjo apresentam o mesmo tipo de dados; ! Esse tipo de dado representa o conjunto de informações; ! Exemplo: 19 TipoNodo = registro Nome : string Código : inteiro Valor : real Fim registro TipoLista = arranjo [1..N] de TipoNodo
  • 20. Inserção de um Novo Nodo ! Inserção como primeiro nodo da lista; ! Inserção como último nodo da lista; ! Inserção no meio da lista. 20
  • 21. Algoritmo de Inserção no Início da Lista 21 Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Var. auxiliar : Ind (inteiro) início se (IA = IL) e (FA = FL) então Sucesso ← falso senão início se IL = 0 então IL ← FL ← IA senão se IL > IA então IL ← IL-1 senão início {Deslocar nodos para cima} para Ind de FL incr -1 até IL faça LL[Ind+1] ← LL[Ind] FL ← FL+1 fim LL[IL] ← infoNodo Sucesso ← verdadeiro fim fim IA FA
  • 22. Algoritmo de Inserção no Fim da Lista 22 Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Var. auxiliar : Ind (inteiro) início se (IA = IL) e (FA = FL) então Sucesso ← falso senão início se IL = 0 então IL ← FL ← IA senão se FL < FA então FL ← FL+1 senão início {Deslocar nodos para cima} para Ind de IL incr 1 até FL faça LL[Ind-1] ← LL[Ind] IL ← IL-1 fim LL[FL] ← infoNodo Sucesso ← verdadeiro fim fim IA FA
  • 23. 23 início se (IA = IL e FA = FL) ou (K > FL-IL+2) ou (k<=0) ou (IL=0 e K ≠ 1) então Sucesso ← falso senão início se IL = 0 então {Lista Vazia} IL ← FL ← IA senão se FL < FA então {Tem espaço no fim} início {Deslocar nodos para direita} para Ind de FL incr -1 até IL+K-1 faça LL[Ind+1] ← LL[Ind] FL ← FL + 1 fim senão início {Deslocar nodos para esquerda} para Ind de IL incr 1 até IL+K-1 faça LL[Ind-1] ← LL[Ind] IL ← IL-1 //k ← k+1 fim LL[IL+K-1] ← infoNodo Sucesso ← verdadeiro fim fim Inserção no meio da Lista Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) K (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Variável auxiliar : Ind (inteiro) IA FA
  • 24. 24 início se (IA = IL e FA = FL) ou (K > FL-IL+2) ou (k<=0) ou (k>FA) então Sucesso ← falso senão início se IL = 0 então {Lista Vazia} IL ← FL ← (FA+1) div 2 {Insere no meio} senão se IL = IA ou ((FL < FA) e (K>(FL-IL+2)/2)) então início {Deslocar nodos para direita} para Ind de FL incr -1 até IL+K-1 faça LL[Ind+1] ← LL[Ind] FL ← FL + 1 fim senão início {Deslocar nodos para esquerda} para Ind de IL incr 1 até IL+K-1 faça LL[Ind-1] ← LL[Ind] IL ← IL-1 k ← k+1 fim LL[IL+K-1] ← infoNodo Sucesso ← verdadeiro fim fim Inserção no meio da Lista Otimizado Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) K (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Variável auxiliar : Ind (inteiro) IA FA
  • 25. 25 início se (K<=0) ou (K>FL-IL+1) então Sucesso ← falso senão início para Ind de IL+K-1 incr 1 até FL faça LL[Ind] ← LL[Ind+1] FL ← FL-1 se FL = IL-1 então IL ← FL ← 0 Sucesso ← verdadeiro fim fim Remoção de um Nodo Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) K (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Variável auxiliar : Ind (inteiro) IA FA
  • 26. Acesso ao Nodo Identificado por sua Ordem na Lista 26 Entradas: LL (TipoLista) IL,FL (inteiro) K (inteiro) Saída: InfoNodo (TipoNodo) Sucesso (lógico) início se (K <= 0) ou (K > FL-IL+1) ou (IL = 0) então Sucesso ← falso senão início InfoNodo ← LL[IL+K-1] Sucesso ← verdadeiro fim fim IA FA
  • 27. Acesso a Nodo Identificado através de Seu Conteúdo 27 TipoNodo = registro Valor : inteiro Info : TipoInfo fim registro início Achou ← falso Posição ← 0 I ← IL enquanto (I <= FL) e (não achou) faça se LL[I].Valor = ValBuscado então início Posição ← (I-IL+1) Achou ← verdadeiro fim senão I ← I + 1 retorna posição fim Entradas: LL (TipoLista) IL, FL (inteiro) ValBuscado (TipoNodo) Saídas: Posição (inteiro) Variáveis auxiliares : Achou (lógico) IA FA
  • 28. Acesso a Nodo identificado através do conteúdo ordenado 28 início Achou ← falso Posição ← 0 Inf ← IL Sup ← FL enquanto (Inf<=Sup) e (não Achou) faça início Meio ← (Inf+Sup) div 2 se LL[Meio].Valor = ValorBuscado então início Posição ← Meio Achou ← verdadeiro fim senão se LL[Meio].Valor < ValBuscado então Inf ← Meio+1 senão Sup ← Meio-1 fim retorna posição fim Entradas: LL (TipoLista) IL, FL (inteiro) ValBuscado (TipoNodo) Saídas: Posição (inteiro) Variáveis auxiliares : Meio, Inf, Sup (inteiro) Achou (lógico) IA FA
  • 29. Trabalho ! Faça um programa que contenha todos os algoritmos mostrados até agora. ! Crie uma função para cada um. ! Crie um menu para que o usuário possa escolher uma dessas opções. ! Crie uma função para ordenar a lista antes de fazer a busca em lista ordenada. 29
  • 30. Listas Lineares Encadeadas ! Estrutura de Dados que cresce e diminui quando nodos são inseridos ou excluídos; ! São denominados estruturas dinâmicas; ! Armazenam cada nodo da lista por alocação dinâmica de memória; ! Uma das formas de implementação de estrutura dinâmica é através de encadeamento. 30
  • 31. Listas Lineares Encadeadas ! A ordem dos nodos é definida por uma informação contida no próximo nodo; ! Essa informação está no: “campo elo”; ! Podem estar alocados em qualquer posição da memória, contígua ou não; ! A contiguidade de uma lista linear encadeada é lógica. 31
  • 32. Listas Lineares Encadeadas ! Para implementar uma lista, utiliza-se ponteiros; ! A aplicação não tem acesso direto ao endereço contido no ponteiro; ! Mas permite que este endereço seja testado e utilizado para alcançar o próximo da lista; ! O espaço total de memória gasto pela estrutura é proporcional ao número de nodos armazenados na lista. 32
  • 33. Uma Lista Linear Encadeada deve apresentar ! Um ponteiro para o primeiro nodo da lista. ! Assim é feito o acesso à lista; ! Pode ser uma variável simples do tipo do ponteiro ou uma estrutura (registro). ! Encadeamento entre os nodos, através de algum campo de elo; ! Uma indicação de final da lista (nulo). 33
  • 34. Exemplo de um tipos de dados que serão utilizados 34 TipoPtNodo = ↑TipoNodo TipoNodo = registro Info: TipoInfoNodo Elo : TipoPtNodo fim registro
  • 35. Criação de Uma Lista Linear Encadeada 35 Entradas: - Saída: PtLista (TipoPtNodo) início PtLista ← nulo fim
  • 36. Inserção de um Novo Nodo ! Para inserir um novo nodo em uma lista encadeada deve: ! alocar um novo nodo; ! preenchê-lo com o valor correspondente. ! Caso não consiga alocar um novo nodo e preenchê-lo por falta de espaço físico, avise ao usuário; ! Insira o nodo na posição indicada na lista; ! Para isso, precisa adequar os campo “elo” do nodo anterior. 36
  • 37. Inserção no início da lista encadeada 37 Novo nodo PtLista L1 L2 L3 PtLista L2 L3 L4L1
  • 38. Inserção no início da lista encadeada 38 Entradas: PtLista (TipoPtNodo) Dados (TipoInfoNodo) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variável auxiliar: PtNovo (TipoPtNodo) início alocar (PtNovo) se PtNovo = nulo então Sucesso ← falso senão início PtNovo↑.Info ← Dados PtNovo↑.Elo ← PtLista PtLista ← PtNovo Sucesso ← verdadeiro fim fim
  • 39. Inserção no final da lista encadeada 39 PtLista L1 L2 L3 PtLista L2 L3 L4L1 Novo nodo
  • 40. Inserção no final da lista encadeada 40 início alocar (PtNovo) se PtNovo = nulo então Sucesso ← falso senão início PtNovo↑.Info ← Dados PtNovo↑.Elo ← nulo se PtLista = nulo então PtLista ← PtNovo senão PtAux ← PtLista enquanto PtAux↑.Elo ≠ nulo faça PtAux ← PtAux↑.Elo PtAux↑.Elo ← PtNovo fim Sucesso ← verdadeiro fim fim Entradas: PtLista (TipoPtNodo) Dados (TipoInfoNodo) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PtNovo, PtAux (TipoPtNodo)
  • 41. Inserção no meio da lista encadeada 41 PtLista L1 L2 L3 PtLista L2 L3 L4L1 Novo nodo
  • 42. 42 início alocar (PtNovo) se PtNovo = nulo então Sucesso ← falso senão se ((PtLista = nulo) e (K ≠ 1)) ou (K < 1) então início {primeiro nó da lista} liberar(PtNovo) {Não foi possível inserir, libera o novo nó} Sucesso ← falso fim senão se k = 1 então início PtNovo↑.Info ← Dados PtNovo↑.Elo ← PtLista PtLista ← PtNovo Sucesso ← verdadeiro fim senão início PtAnt ← PtLista enquanto (PtAnt↑.Elo ≠ nulo) e (k>2) faça início PtAnt ← PtAnt↑.Elo K ← K - 1 fim se K > 2 então início liberar (PtNovo) Sucesso ← falso fim senão início PtNovo↑.Info ← Dados PtNovo↑.Elo ← PtAnt↑.Elo PtAnt↑.Elo ← PtNovo Sucesso ← verdadeiro fim fim Inserção no meio da lista encadeada Entradas: PtLista (TipoPtNodo) K (inteiro) Dados (TipoInfoNodo) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PAnt, PtNovo (TipoPtNodo) PtLista L1 L2 L3 nulo
  • 43. 43 início se K < 1 então Sucesso ← falso senão início PtK ← PtLista PtAnt ← nulo enquanto (PtK ≠ nulo) e (K > 1) faça início K ← K -1 PtAnt ← PtK PtK ← PtK↑.Elo fim se PtK = nulo então Sucesso ← falso senão início se PtK = PtLista então PtLista ← Ptk↑.Elo senão PtAnt↑.Elo ← PtK↑.Elo liberar(PtK) Sucesso ← verdadeiro fim fim fim Remoção de um Nodo Entradas: PtLista (TipoPtNodo) K (inteiro) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PtAnt, PtK (TipoPtNodo) PtLista L1 L2 L3 nulo
  • 44. Acesso a um Nodo 44 início se (K<1) ou (PtLista = nulo) então PtK ← nulo senão início PtK ← PtLista enquanto (PtK ≠ nulo) e (K>1) faça início K ← K-1 PtK ← PtK↑.Elo fim se K > 1 então PtK ← nulo fim retorna PtK fim Entradas: PtLista (TipoPtNodo) K (inteiro) Saídas: PtK:(tipoPtNodo) PtLista L1 L2 L3 nulo
  • 45. 45 Destruição de uma Lista Linear Encadeada início enquanto PtLista ≠ nulo faça início PtRemover ← PtLista PtLista ← PtRemover↑.Elo liberar (PtRemover) fim liberar (PtLista) fim Entradas: PtLista (TipoPtNodo) Saídas: PtLista:(tipoPtNodo) Variável Auxiliar: PtRemover (TipoPtNodo) PtLista L1 L2 L3 nulo
  • 46. Trabalho ! Implementar um programa com menu para as opções de uma lista encadeada: ! Inserção no início; ! Inserção no fim; ! Inserção no meio; ! Remoção; ! Acesso a um nó; ! Destruição. ! Implemente da mesma forma utilizada para inserção em Lista Linear usando Vetor. 46
  • 47. Lista Encadeada Circular ! Apresenta uma lista linear encadeada ligando o último nodo ao primeiro. 47 PtLista L1 L2 L3
  • 48. 48 início alocar (PtNovo) se PtNovo = nulo então Sucesso ← falso senão se ((PtLista = nulo) e (K ≠ 1)) ou (K < 1) então início liberar(PtNovo) {Não foi possível inserir, libera o novo nó} Sucesso ← falso fim senão início Sucesso ← verdadeiro PtNovo↑.Info ← Dados se k = 1 então início se PtLista = nulo então PtNovo↑.Elo ← PtNovo senão início PtAnt ← PtLista enquanto (PtAnt↑.Elo ≠ PtLista) faça PtAnt ← PtAnt.Elo PtNovo↑.Elo ← PtLista PtAnt↑.Elo ← PtNovo fim PtLista ← PtNovo fim Entradas: PtLista (TipoPtNodo) K (inteiro) Dados (TipoInfoNodo) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PAnt, PtNovo (TipoPtNodo) Inserção de um Novo Nodo PtLista L1 L2 L3
  • 49. Inserção de um Novo Nodo 49 senão início PtAnt ← PtLista enquanto (PtAnt↑.Elo ≠ PtLista) e (K > 2) faça início PtAnt ← PtAnt↑.Elo K ← K - 1 fim se (k > 2) então início liberar(PtNovo) Sucesso ← falso fim senão início PtNovo↑.Info ← Dados {INSERE NO MEIO} PtNovo↑.Elo ← PtAnt↑.Elo PtAnt↑.Elo ← PtNovo fim fim fim fim Entradas: PtLista (TipoPtNodo) K (inteiro) Dados (TipoInfoNodo) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PAnt, PtNovo (TipoPtNodo) Inserção de um Novo Nodo PtLista L1 L2 L3
  • 50. 50 início se (K < 1) ou (PtLista=nulo) então Sucesso ← falso senão início Sucesso ← verdadeiro se K = 1 então se PtLista↑.Elo = PtLista então início liberar(PtLista) PtLista ← nulo fim senão início PtAnt ← PtLista enquanto PtAnt↑.Elo ≠ PtLista faça PtAnt ← PtAnt↑.Elo PtAnt↑.Elo ← PtLista↑.Elo Liberar (PtLista) PtLista ← PtAnt↑.Elo fim senão início PtAnt ← PtLista enquanto (PtAnt↑.Elo ≠ PtLista) e (K > 2) faça início PtAnt ← PtAnt↑.Elo K ← K -1 fim se PtAnt↑.Elo = PtLista então {ORDEM FORA DA LISTA} Sucesso ← falso senão início PtK ← PtAnt↑.Elo PtAnt↑.Elo ← PtK↑.Elo liberar (PtK) fim fim fim fim Remoção de um Nodo Entradas: PtLista (TipoPtNodo) K (inteiro) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PtAnt, PtK (TipoPtNodo) PtLista L1 L2 L3
  • 51. 51 Mostrar todos os Nodos da Lista início se PtLista = nulo então escrever (‘Lista Vazia!’) senão início PtAux ← PtLista repita escrever(PtAux↑.Info) PtAux ← PtAux↑.Elo até que PtAux = PtLista fim fim Entradas: PtLista (TipoPtNodo) Saídas: - Variável Auxiliar: PtAux (TipoPtNodo) PtLista L1 L2 L3
  • 52. Listas Lineares Duplamente Encadeadas ! Permite que a lista seja percorrida nos dois sentidos; ! Apresenta 2 campos de elo (anterior e próximo); ! O primeiro anterior aponta para nulo assim como o último próximo 52
  • 53. PtLista L1 L2 L3 nulonulo Listas Lineares Duplamente Encadeadas InfoAnt Próx Nodo Genérico TipoNodo = registro Ant : TipoPtNodo Info: TipoInfoNodo Próx: TipoPtNodo fim registro
  • 54. PtLista L1 L2 L3 nulonulo Novo Nodo PtLista L1 L2 L4 nulonulo Novo Nodo L3
  • 55. 55 início alocar (PtNovo) se PtNovo = nulo então Sucesso ← falso senão se ((PtLista = nulo) e (K ≠ 1)) ou (K < 1) então início liberar(PtNovo) Sucesso ← falso fim senão se k = 1 então início PtNovo↑.Info ← Dados PtNovo↑.Prox ← PtLista se PtLista ≠ nulo então PtLista↑.Ant ← PtNovo PtNovo↑.Ant ← nulo PtLista ← PtNovo Sucesso ← verdadeiro fim senão... Entradas: PtLista (TipoPtNodo) K (inteiro) Dados (TipoInfoNodo) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PAnt, PtNovo (TipoPtNodo) Inserção de um Novo Nodo PtLista L1 nulonulo L2 L3
  • 56. 56 senão início PtAnt ← PtLista enquanto (PtAnt↑.Prox ≠ nulo) e (K > 2) faça início PtAnt ← PtAnt↑.Prox K ← K - 1 fim se K > 2 então início liberar(PtNovo) Sucesso ← falso fim senão início PtNovo↑.Info ← Dados PtNovo↑.Prox ← PtAnt↑.Prox PtNovo↑.Ant ← PtAnt PtAnt↑.Prox ← PtNovo se PtNovo↑.Prox ≠ nulo então PtNovo↑.Prox↑.Ant ← PtNovo Sucesso ← verdadeiro fim fim fim Inserção de um Novo Nodo PtLista L1 nulonulo L2 L3
  • 57. 57 início se ((PtLista=nulo) ou (K < 1) então Sucesso ← falso senão início PtK ← PtLista enquanto (Ptk ≠ nulo) e (K > 1) faça início K ← K - 1 PtK ← PtK↑.Prox fim se PtK = nulo então Sucesso ← falso senão início sucesso ← verdadeiro se PtK = PtLista então início se PtLista↑.Prox = nulo PtLista = nulo senão início PtLista↑.Prox↑.Ant ← nulo PtLista ← PtLista↑.Prox fim fim senão início PtK↑.Ant↑.Prox ← PtK↑.Prox se PtK↑.Prox ≠ nulo então PtK↑.Prox↑.Ant ← PtK↑.Ant fim fim liberar (PtK) fim fim fim Remoção de um Nodo Entradas: PtLista (TipoPtNodo) K (inteiro) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PtK (TipoPtNodo) PtLista L1 nulonulo L2 L3
  • 58. 58 Acesso à Lista Duplamente Encadeada início se PtLista = nulo então escrever (‘Lista Vazia!’) senão início PtAux ← PtLista enquanto PtAux↑.Prox ≠ nulo faça PtAux ← PtAux↑.Prox enquanto PtAux ≠ PtLista faça início escrever(PtAux↑.Info) PtAux ← PtAux↑.Ant fim escrever(PtAux↑.Info) fim fim Entradas: PtLista (TipoPtNodo) Saídas: - Variável Auxiliar: PtAux (TipoPtNodo) PtLista L1 nulonulo L2 L3
  • 59. Lista Duplamente Encadeada, com Descritor 59 TipoDescrLDE = registro Prim: TipoPtNodo N : inteiro Ult : TipoPtNodo fim registro PtDescrLDE L1 nulonulo L2 L3 3 Prim UltN
  • 60. Lista Duplamente Encadeada Circular ! O último nodo tem o primeiro nodo como o próximo; ! A lista pode ser percorrida em qualquer sentido; ! O acesso à lista é sempre feito através de seu primeiro nodo; ! Caso se conheça o número de nodos da lista, é possível escolher o melhor sentido de percurso, quando se quer inserir no meio ou buscar um elemento; 60
  • 61. 61 PtLista L1 L2 L3 Lista Duplamente Encadeada Circular
  • 62. ! Diferenças da LDE e LDEC quanto à implementação: ! Criar a lista é similar; ! A forma de acessar os nodos da lista é pouco alterada: mudando somente no final da lista quando o último nodo aponta para o primeiro; ! O mesmo acontece com a destruição da lista; ! Maiores alterações: inserção e remoção. 62 Lista Duplamente Encadeada Circular LDEC
  • 63. Inserção de um Novo Nodo em uma LDEC Entradas: PtLista (TipoPtNodo) Dados (TipoInfoNodo) Saídas: PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PtNovo (TipoPtNodo) PtLista L1 L2 L3
  • 64. 64 início se PtLista = nulo então Sucesso ← falso senão início Sucesso ← verdadeiro PtAux ← PtLista se PtLista↑.Prox = PtLista então PtLista ← nulo senão PtLista↑.Prox↑.Ant ← PtLista↑.Ant PtLista↑.Ant↑.Prox ← PtLista↑.Prox PtLista ← PtLista↑.Prox fim liberar(PtAux) fim fim Remoção de um Nodo em uma LDEC Entradas: PtLista (TipoPtNodo) Saídas : PtLista:(tipoPtNodo) Sucesso (lógico) Variáveis auxiliares: PtAux (TipoPtNodo) PtLista L1 L2 L3