Aula 07 - lista linear
-
Upload
cristiano-pires-martins -
Category
Technology
-
view
1.486 -
download
2
Transcript of Aula 07 - lista linear
Listas LinearesCristiano 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ória1
23
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 = registroNome : stringCódigo : inteiroValor : 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íciose (IA = IL) e (FA = FL) então
Sucesso ← falsosenão início
se IL = 0 entãoIL ← FL ← IA
senão se IL > IA entãoIL ← IL-1
senão início {Deslocar nodos para cima}
para Ind de FL incr -1 até IL façaLL[Ind+1] ← LL[Ind]
FL ← FL+1fimLL[IL] ← infoNodoSucesso ← verdadeiro
fimfim
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íciose (IA = IL) e (FA = FL) então
Sucesso ← falsosenão início
se IL = 0 entãoIL ← FL ← IA
senão se FL < FA entãoFL ← FL+1
senão início {Deslocar nodos para cima}
para Ind de IL incr 1 até FL façaLL[Ind-1] ← LL[Ind]
IL ← IL-1fimLL[FL] ← infoNodoSucesso ← verdadeiro
fimfim
IA FA
23
iníciose (IA = IL e FA = FL) ou (K > FL-IL+2) ou (k<=0) ou (IL=0 e K ≠ 1) então
Sucesso ← falsosenã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çaLL[Ind+1] ← LL[Ind]
FL ← FL + 1fimsenão início {Deslocar nodos para esquerda}
para Ind de IL incr 1 até IL+K-1 façaLL[Ind-1] ← LL[Ind]
IL ← IL-1//k ← k+1
fimLL[IL+K-1] ← infoNodoSucesso ← verdadeiro
fimfim
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íciose (IA = IL e FA = FL) ou (K > FL-IL+2) ou (k<=0) ou (k>FA) então
Sucesso ← falsosenã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çaLL[Ind+1] ← LL[Ind]
FL ← FL + 1fimsenão início {Deslocar nodos para esquerda}
para Ind de IL incr 1 até IL+K-1 façaLL[Ind-1] ← LL[Ind]
IL ← IL-1k ← k+1
fimLL[IL+K-1] ← infoNodoSucesso ← verdadeiro
fimfim
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íciose (K<=0) ou (K>FL-IL+1) então
Sucesso ← falso senãoinício
para Ind de IL+K-1 incr 1 até FL façaLL[Ind] ← LL[Ind+1]
FL ← FL-1se FL = IL-1 então
IL ← FL ← 0Sucesso ← verdadeiro
fimfim
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íciose (K <= 0) ou (K > FL-IL+1) ou (IL = 0) então
Sucesso ← falsosenão início
InfoNodo ← LL[IL+K-1]Sucesso ← verdadeiro
fimfim
IA FA
Acesso a Nodo Identificado através de Seu Conteúdo
27
TipoNodo = registroValor : inteiroInfo : TipoInfo
fim registro
inícioAchou ← falsoPosição ← 0I ← ILenquanto (I <= FL) e (não achou) faça se LL[I].Valor = ValBuscado então inícioPosição ← (I-IL+1)Achou ← verdadeirofim
senãoI ← I + 1
retorna posiçãofim
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ícioAchou ← falsoPosição ← 0Inf ← ILSup ← FLenquanto (Inf<=Sup) e (não Achou) façainício
Meio ← (Inf+Sup) div 2se LL[Meio].Valor = ValorBuscado entãoinício
Posição ← MeioAchou ← verdadeiro
fimsenão se LL[Meio].Valor < ValBuscado então
Inf ← Meio+1senão
Sup ← Meio-1fimretorna 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 = ↑TipoNodoTipoNodo = registro
Info: TipoInfoNodoElo : TipoPtNodo
fim registro
Criação de Uma Lista Linear Encadeada
35Entradas: - Saída: PtLista (TipoPtNodo)
inícioPtLista ← 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ícioalocar (PtNovo)se PtNovo = nulo então
Sucesso ← falsosenãoinício
PtNovo↑.Info ← DadosPtNovo↑.Elo ← PtListaPtLista ← PtNovoSucesso ← verdadeiro
fimfim
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ícioalocar (PtNovo)se PtNovo = nulo então
Sucesso ← falsosenãoinício
PtNovo↑.Info ← DadosPtNovo↑.Elo ← nulose PtLista = nulo então
PtLista ← PtNovosenão
PtAux ← PtListaenquanto PtAux↑.Elo ≠ nulo faça
PtAux ← PtAux↑.EloPtAux↑.Elo ← PtNovo
fimSucesso ← verdadeiro
fimfim
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ícioalocar (PtNovo)se PtNovo = nulo então
Sucesso ← falsosenã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
fimsenão se k = 1 então início
PtNovo↑.Info ← DadosPtNovo↑.Elo ← PtListaPtLista ← PtNovoSucesso ← verdadeiro
fimsenão início
PtAnt ← PtListaenquanto (PtAnt↑.Elo ≠ nulo) e (k>2) faça início
PtAnt ← PtAnt↑.EloK ← K - 1
fimse K > 2 então início
liberar (PtNovo)Sucesso ← falso
fimsenão início
PtNovo↑.Info ← DadosPtNovo↑.Elo ← PtAnt↑.EloPtAnt↑.Elo ← PtNovoSucesso ← verdadeiro
fimfim
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íciose K < 1 então
Sucesso ← falsosenão início
PtK ← PtListaPtAnt ← nuloenquanto (PtK ≠ nulo) e (K > 1) faça início
K ← K -1PtAnt ← PtKPtK ← PtK↑.Elo
fimse PtK = nulo então
Sucesso ← falsosenão início
se PtK = PtLista entãoPtLista ← Ptk↑.Elo
senãoPtAnt↑.Elo ← PtK↑.Elo
liberar(PtK)Sucesso ← verdadeiro
fimfim
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íciose (K<1) ou (PtLista = nulo) então
PtK ← nulosenão início
PtK ← PtListaenquanto (PtK ≠ nulo) e (K>1) faça início
K ← K-1 PtK ← PtK↑.Elo
fimse K > 1 então
PtK ← nulofimretorna 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ícioenquanto PtLista ≠ nulo faça início
PtRemover ← PtListaPtLista ← PtRemover↑.Eloliberar (PtRemover)
fimliberar (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ícioalocar (PtNovo)se PtNovo = nulo então
Sucesso ← falsosenã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
fimsenão início
Sucesso ← verdadeiroPtNovo↑.Info ← Dadosse k = 1 então início
se PtLista = nulo entãoPtNovo↑.Elo ← PtNovo
senão inícioPtAnt ← PtListaenquanto (PtAnt↑.Elo ≠ PtLista) faça
PtAnt ← PtAnt.EloPtNovo↑.Elo ← PtListaPtAnt↑.Elo ← PtNovo
fimPtLista ← 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ícioPtAnt ← PtListaenquanto (PtAnt↑.Elo ≠ PtLista) e (K > 2) faça início
PtAnt ← PtAnt↑.EloK ← K - 1
fimse (k > 2) então início
liberar(PtNovo)Sucesso ← falso
fimsenão início
PtNovo↑.Info ← Dados {INSERE NO MEIO}PtNovo↑.Elo ← PtAnt↑.EloPtAnt↑.Elo ← PtNovo
fimfim
fimfim
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íciose (K < 1) ou (PtLista=nulo) então
Sucesso ← falsosenão início
Sucesso ← verdadeirose K = 1 então
se PtLista↑.Elo = PtLista então inícioliberar(PtLista)PtLista ← nulo
fimsenão início
PtAnt ← PtListaenquanto PtAnt↑.Elo ≠ PtLista faça
PtAnt ← PtAnt↑.EloPtAnt↑.Elo ← PtLista↑.EloLiberar (PtLista)PtLista ← PtAnt↑.Elo
fimsenão início
PtAnt ← PtListaenquanto (PtAnt↑.Elo ≠ PtLista) e (K > 2) faça início
PtAnt ← PtAnt↑.EloK ← K -1
fimse PtAnt↑.Elo = PtLista então {ORDEM FORA DA LISTA}
Sucesso ← falsosenão início
PtK ← PtAnt↑.EloPtAnt↑.Elo ← PtK↑.Eloliberar (PtK)
fimfim
fimfim
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íciose PtLista = nulo então
escrever (‘Lista Vazia!’)senão início
PtAux ← PtListarepita
escrever(PtAux↑.Info) PtAux ← PtAux↑.Elo
até que PtAux = PtListafim
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 = registroAnt : TipoPtNodoInfo: TipoInfoNodoPróx: TipoPtNodo
fim registro
PtLista
L1 L2 L3 nulonulo
Novo Nodo
PtLista
L1 L2 L4 nulonulo
Novo Nodo
L3
55
inícioalocar (PtNovo)se PtNovo = nulo então
Sucesso ← falsosenão se ((PtLista = nulo) e (K ≠ 1)) ou (K < 1) então início
liberar(PtNovo) Sucesso ← falso
fimsenão se k = 1 então início
PtNovo↑.Info ← DadosPtNovo↑.Prox ← PtListase PtLista ≠ nulo então
PtLista↑.Ant ← PtNovoPtNovo↑.Ant ← nuloPtLista ← PtNovoSucesso ← verdadeiro
fimsenã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ícioPtAnt ← PtListaenquanto (PtAnt↑.Prox ≠ nulo) e (K > 2) faça início
PtAnt ← PtAnt↑.ProxK ← K - 1
fimse K > 2 então início
liberar(PtNovo)Sucesso ← falso
fimsenão início
PtNovo↑.Info ← DadosPtNovo↑.Prox ← PtAnt↑.ProxPtNovo↑.Ant ← PtAntPtAnt↑.Prox ← PtNovose PtNovo↑.Prox ≠ nulo então
PtNovo↑.Prox↑.Ant ← PtNovoSucesso ← verdadeiro
fimfim
fim
Inserção de um Novo Nodo
PtLista
L1 nulonulo L2 L3
57
iníciose ((PtLista=nulo) ou (K < 1) então
Sucesso ← falsosenão início
PtK ← PtListaenquanto (Ptk ≠ nulo) e (K > 1) faça início
K ← K - 1PtK ← PtK↑.Prox
fimse PtK = nulo então
Sucesso ← falsosenão início
sucesso ← verdadeirose PtK = PtLista então início
se PtLista↑.Prox = nuloPtLista = nulo
senão inícioPtLista↑.Prox↑.Ant ← nuloPtLista ← PtLista↑.Prox
fimfimsenão início
PtK↑.Ant↑.Prox ← PtK↑.Proxse PtK↑.Prox ≠ nulo então
PtK↑.Prox↑.Ant ← PtK↑.Antfim
fimliberar (PtK)
fimfim
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íciose PtLista = nulo então
escrever (‘Lista Vazia!’)senão início
PtAux ← PtListaenquanto PtAux↑.Prox ≠ nulo faça
PtAux ← PtAux↑.Proxenquanto PtAux ≠ PtLista faça início
escrever(PtAux↑.Info)PtAux ← PtAux↑.Ant
fimescrever(PtAux↑.Info)
fimfim
Entradas: PtLista (TipoPtNodo)Saídas: -Variável Auxiliar: PtAux (TipoPtNodo)
PtLista
L1 nulonulo L2 L3
Lista Duplamente Encadeada, com Descritor
59
TipoDescrLDE = registroPrim: TipoPtNodoN : inteiroUlt : 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íciose PtLista = nulo então
Sucesso ← falsosenão início
Sucesso ← verdadeiroPtAux ← PtListase PtLista↑.Prox = PtLista então
PtLista ← nulosenão
PtLista↑.Prox↑.Ant ← PtLista↑.AntPtLista↑.Ant↑.Prox ← PtLista↑.ProxPtLista ← PtLista↑.Prox
fimliberar(PtAux)
fimfim
Remoção de um Nodo em uma LDECEntradas: PtLista (TipoPtNodo)Saídas : PtLista:(tipoPtNodo)
Sucesso (lógico)Variáveis auxiliares: PtAux (TipoPtNodo)
PtLista
L1 L2 L3