aula 07 - lista linear
TRANSCRIPT
![Page 1: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/1.jpg)
Listas LinearesCristiano Pires Martins
![Page 2: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/2.jpg)
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.
![Page 3: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/3.jpg)
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.
![Page 4: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/4.jpg)
Lista Linear
1o nodo 2o nodo Último nodo
![Page 5: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/5.jpg)
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.
![Page 6: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/6.jpg)
Estrutura Interna de Cada Nodo
! Pode apresentar qualquer nível de complexidade:! Simples;! Arranjo;! Registro;! Tipo Abstrato de Dados.
![Page 7: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/7.jpg)
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
!
![Page 8: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/8.jpg)
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.
![Page 9: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/9.jpg)
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
![Page 10: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/10.jpg)
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.
![Page 11: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/11.jpg)
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
![Page 12: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/12.jpg)
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.
![Page 13: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/13.jpg)
Lista Linear Implementada Através de um Vetor
L1 L2 L3 L4 L5 L6
L1 L2 L3 L4 L5 L6
![Page 14: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/14.jpg)
Operações Mais Frequentes com Listas Lineares
! Busca;
! Inserção;
! Remoção.
![Page 15: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/15.jpg)
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.
![Page 16: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/16.jpg)
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.
![Page 17: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/17.jpg)
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
![Page 18: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/18.jpg)
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
![Page 19: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/19.jpg)
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
![Page 20: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/20.jpg)
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
![Page 21: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/21.jpg)
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
![Page 22: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/22.jpg)
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
![Page 23: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/23.jpg)
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
![Page 24: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/24.jpg)
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
![Page 25: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/25.jpg)
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
![Page 26: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/26.jpg)
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
![Page 27: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/27.jpg)
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
![Page 28: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/28.jpg)
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
![Page 29: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/29.jpg)
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
![Page 30: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/30.jpg)
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
![Page 31: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/31.jpg)
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
![Page 32: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/32.jpg)
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
![Page 33: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/33.jpg)
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
![Page 34: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/34.jpg)
Exemplo de um tipos de dados que serão utilizados
34 TipoPtNodo = ↑TipoNodoTipoNodo = registro
Info: TipoInfoNodoElo : TipoPtNodo
fim registro
![Page 35: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/35.jpg)
Criação de Uma Lista Linear Encadeada
35Entradas: - Saída: PtLista (TipoPtNodo)
inícioPtLista ← nulo
fim
![Page 36: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/36.jpg)
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
![Page 37: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/37.jpg)
Inserção no início da lista encadeada
37
Novo nodo
PtLista
L1 L2 L3
PtLista
L2 L3 L4L1
![Page 38: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/38.jpg)
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
![Page 39: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/39.jpg)
Inserção no final da lista encadeada
39
PtLista
L1 L2 L3
PtLista
L2 L3 L4L1
Novo nodo
![Page 40: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/40.jpg)
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)
![Page 41: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/41.jpg)
Inserção no meio da lista encadeada
41
PtLista
L1 L2 L3
PtLista
L2
L3
L4L1
Novo nodo
![Page 42: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/42.jpg)
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
![Page 43: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/43.jpg)
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
![Page 44: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/44.jpg)
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
![Page 45: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/45.jpg)
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
![Page 46: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/46.jpg)
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
![Page 47: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/47.jpg)
Lista Encadeada Circular
! Apresenta uma lista linear encadeada ligando o último nodo ao primeiro.
47
PtLista
L1 L2 L3
![Page 48: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/48.jpg)
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
![Page 49: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/49.jpg)
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
![Page 50: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/50.jpg)
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
![Page 51: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/51.jpg)
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
![Page 52: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/52.jpg)
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
![Page 53: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/53.jpg)
PtLista
L1 L2 L3 nulonulo
Listas Lineares Duplamente Encadeadas
InfoAnt Próx
Nodo Genérico
TipoNodo = registroAnt : TipoPtNodoInfo: TipoInfoNodoPróx: TipoPtNodo
fim registro
![Page 54: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/54.jpg)
PtLista
L1 L2 L3 nulonulo
Novo Nodo
PtLista
L1 L2 L4 nulonulo
Novo Nodo
L3
![Page 55: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/55.jpg)
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
![Page 56: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/56.jpg)
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
![Page 57: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/57.jpg)
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
![Page 58: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/58.jpg)
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
![Page 59: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/59.jpg)
Lista Duplamente Encadeada, com Descritor
59
TipoDescrLDE = registroPrim: TipoPtNodoN : inteiroUlt : TipoPtNodo
fim registro
PtDescrLDE
L1 nulonulo L2 L3
3
Prim UltN
![Page 60: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/60.jpg)
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
![Page 61: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/61.jpg)
61 PtLista
L1 L2 L3
Lista Duplamente Encadeada Circular
![Page 62: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/62.jpg)
! 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
![Page 63: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/63.jpg)
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
![Page 64: Aula 07 - lista linear](https://reader033.vdocuments.com.br/reader033/viewer/2022042607/55939df91a28abf77f8b464d/html5/thumbnails/64.jpg)
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