Aula 07 - lista linear

Post on 01-Jul-2015

1.486 views 2 download

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