Aula 07 - lista linear

64
Listas Lineares Cristiano Pires Martins

Transcript of Aula 07 - lista linear

Page 1: Aula 07 - lista linear

Listas LinearesCristiano Pires Martins

Page 2: Aula 07 - lista linear

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

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

Lista Linear

1o nodo 2o nodo Último nodo

Page 5: Aula 07 - lista linear

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

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

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

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

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

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

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

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

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

Operações Mais Frequentes com Listas Lineares

! Busca;

! Inserção;

! Remoção.

Page 15: Aula 07 - lista linear

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Criação de Uma Lista Linear Encadeada

35Entradas: - Saída: PtLista (TipoPtNodo)

inícioPtLista ← nulo

fim

Page 36: Aula 07 - lista linear

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

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

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

Inserção no final da lista encadeada

39

PtLista

L1 L2 L3

PtLista

L2 L3 L4L1

Novo nodo

Page 40: Aula 07 - lista linear

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

Inserção no meio da lista encadeada

41

PtLista

L1 L2 L3

PtLista

L2

L3

L4L1

Novo nodo

Page 42: Aula 07 - lista linear

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

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

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

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

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

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

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

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

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

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

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

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

PtLista

L1 L2 L3 nulonulo

Novo Nodo

PtLista

L1 L2 L4 nulonulo

Novo Nodo

L3

Page 55: Aula 07 - lista linear

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

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

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

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

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

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

61 PtLista

L1 L2 L3

Lista Duplamente Encadeada Circular

Page 62: Aula 07 - lista linear

! 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

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

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