Aula 07 - lista linear

2.526 visualizações

Publicada em

Publicada em: Tecnologia
1 comentário
6 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
2.526
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
182
Comentários
1
Gostaram
6
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Aula 07 - lista linear

  1. 1. Listas Lineares Cristiano Pires Martins
  2. 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. 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. 4. Lista Linear 1o nodo 2o nodo Último nodo
  5. 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. 6. Estrutura Interna de Cada Nodo ! Pode apresentar qualquer nível de complexidade: ! Simples; ! Arranjo; ! Registro; ! Tipo Abstrato de Dados.
  7. 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. 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. 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. 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. 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. 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. 13. Lista Linear Implementada Através de um Vetor L1 L2 L3 L4 L5 L6 L1 L2 L3 L4 L5 L6
  14. 14. Operações Mais Frequentes com Listas Lineares ! Busca; ! Inserção; ! Remoção.
  15. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 34. Exemplo de um tipos de dados que serão utilizados 34 TipoPtNodo = ↑TipoNodo TipoNodo = registro Info: TipoInfoNodo Elo : TipoPtNodo fim registro
  35. 35. Criação de Uma Lista Linear Encadeada 35 Entradas: - Saída: PtLista (TipoPtNodo) início PtLista ← nulo fim
  36. 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. 37. Inserção no início da lista encadeada 37 Novo nodo PtLista L1 L2 L3 PtLista L2 L3 L4L1
  38. 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. 39. Inserção no final da lista encadeada 39 PtLista L1 L2 L3 PtLista L2 L3 L4L1 Novo nodo
  40. 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. 41. Inserção no meio da lista encadeada 41 PtLista L1 L2 L3 PtLista L2 L3 L4L1 Novo nodo
  42. 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. 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. 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. 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. 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. 47. Lista Encadeada Circular ! Apresenta uma lista linear encadeada ligando o último nodo ao primeiro. 47 PtLista L1 L2 L3
  48. 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. 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. 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. 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. 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. 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. 54. PtLista L1 L2 L3 nulonulo Novo Nodo PtLista L1 L2 L4 nulonulo Novo Nodo L3
  55. 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. 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. 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. 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. 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. 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. 61 PtLista L1 L2 L3 Lista Duplamente Encadeada Circular
  62. 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. 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. 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

×