• Nenhum resultado encontrado

Listas Lineares

N/A
N/A
Protected

Academic year: 2021

Share "Listas Lineares"

Copied!
148
0
0

Texto

(1)

William Malvezzi, MSc

William Malvezzi, MSc

(2)

Listas lineares

Estudo de listas lineares e das operações básicas sobre elas, considerando as diferentes formas de implementação física

(3)

Uma Lista Linear (LL) é uma sequênciasequência de nodos

Lista linear

Nodos - elementos do mesmo tipoNodos - Relação de ordem linear (ou total)Relação de ordem

(4)

Lista linear

a

b

c

d

e

Primeiro nodo Último nodo

(5)

• Estrutura interna é abstraída

• Pode ter uma complexidade arbitrária

• Enfatizado o conjunto de relações existente

z

a

b

c

INFORMAÇÕES

Número RG Nome Nasc. Cargo

d

Estrutura dos nodos

(6)

Uma lista linear é uma coleção de n ≥ 0 nodos x1, x2, ... , xn, todos do mesmo tipo, cujas propriedades estruturais relevantes envolvem apenas as posições relativas lineares entre nodos:

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

• Lista linear : sequência de 0 ou mais nodos do mesmo tipo

Definição formal

(7)

Notas de alunos

Cadastro de funcionários de uma empresa

Itens em estoque em uma empresa

Dias da semana

Vagões de um trem

Letras de uma palavra

Pessoas esperando ônibus

Cartas de baralho

(8)

Operações 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

(9)

Contiguidade física

• Encadeamento

Representação física das relações existentes entre os nodosrelações existentes entre os nodos

(10)

Listas lineares

(11)

Implementação de LL através de contiguidade física

• Utiliza a sequencialidade da memória para representar a

ordem entre os nodos

• Endereços fisicamente adjacentes nodos

(12)

L

2

L

1

L

3

L

4

L

5

L

6

L

1

L

2

L

3

L

4

L

5

L

6

1 2 3 4 5 6

L L

Lista linear Arranjo

(13)

Características

 todos os elementos do arranjo tem tipo igual  cada elemento do arranjo é um nodo

 tipo do nodo = tipo do elemento do arranjo  posição no arranjo representa posição na LL  acesso direto aos nodos

 natureza dinâmica – inserção / remoção de nodos  comprimento varia durante aplicação

L2

L1 L3 L4 L5 L6

L1 L2 L3 L4 L5 L6

1 2 3 4 5 6 L L

(14)

TipoNodo = registro Nome: string Código: inteiro Valor: real fim registro

TipoLista = arranjo [1 .. N] de TipoNodo

Tipos de dados

Tipos de dados utilizados nos algoritmos para LL implementada com contiguidade física:

(15)

1 2 3 4 6 7 9 10 LL IL IL FLFL IA IA FAFA L1 L2 L3 L4 L5 5 8 Lista

Início e final da LL geralmente são diferentes do início e final do arranjo

Início e final da LL

(16)

LL Início do Arranjo Final do Arranjo Lista

Início e final da LL geralmente são diferentes do início e final do arranjo

Início e final da LL

Variáveis para identificar Início e Final da Lista

1 2 3 4 6 7 9 10

IL FL

IA FA

L1 L2 L3 L4 L5

(17)

Um mesmo arranjo pode ser utilizado para mais de uma lista linear

Mais de uma LL em um arranjo

1 2 3 4 6 7 9 10 LL IL1 FL2 IA FA L1 L2 L1 L2 L3 5 8 IL2 FL1 Lista 1 Lista 2

(18)

• criação da lista

• inserção de um novo nodo

• remoção de um nodo

• acesso a um nodo

Operações sobre listas lineares em

contiguidade física

(19)

Criação de uma LL vazia

• Declarar o arranjo

• Inicializar variáveis que guardam início e final da

lista 1 2 3 4 6 7 9 10 LL 5 8 Lista vazia IL = FL = IA-1 IA FA

(20)

Algoritmo:

Inicializar LL sobre Arranjo vazia

Algoritmo 3.1 - InicializarLLArr

Entradas: IA (inteiro) Saídas: IL, FL (inteiro)

início

IL  FL  IA - 1 fim

(21)

Ex:

Ex: Lista de informações de produtos de uma empresa

TipoNodo = registro

Nome: string Código: inteiro Preço: real

fim registro

TipoLista = arranjo [1 .. 10] de TipoNodo

1 2 3 4 6 7 9 10

LL

5 8

IA FA

Nome Código Preço

IL FL

(22)

Inserção de um novo nodo

LL já existente Informar:

Informar:

• posição (ordem) do novo nodo na LL

• valor do campo de informação do novo

nodo

Quando não é possível realizar a inserção:

Quando não é possível realizar a inserção:

• posição solicitada fora dos limites da LL existente

• espaço disponível para a LL no arranjo todo preenchido

L1 L2 L3 L4 L5 L6

0 1 2 3 4 5 6 7 L L

(23)

16 17 18 19 20 13 14 15 11 12 21 22 23

A

No início

16 17 18 19 20 13 14 15 11 12 21 22 23

A

No final

16 17 18 19 20 13 14 15 11 12 21 22 23

A

No meio

(24)

Inserção como primeiro nodo da LL

1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir

(25)

Inserção como primeiro nodo da LL

Inserir

no início

LL inicia no início do arranjo

1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 1 2 3 4 6 7 9 10 LL 5 8 IA FA

(26)

Inserção como primeiro nodo da LL

LL inicia no início do arranjo

1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 1 2 3 4 6 7 9 10 LL L1 L2 L3 L4 L5 L6 L7 5 8 IL FL IA FA Inserir no início Novo nodo

(27)

Inserção como primeiro nodo da LL

LL não inicia no início do arranjo

1 2 3 4 6 7 9 10

LL

IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir no início

(28)

Inserção como primeiro nodo da LL

LL não inicia no início do arranjo

LL LL 1 2 IL3 4 6 7 FL 9 10 IA FA L1 L2 L3 L4 L5 L6 5 8 1 IL2 3 4 6 7 FL 9 10 IA FA L1 L2 L3 L4 L5 L6 L7 5 8 Inserir no início Novo nodo

(29)

Algoritmo 3.2 - InserirIniLLArr Entradas: LL (TipoLista)

IA, FA, IL, FL (inteiro) InfoNodo (TipoNodo)

Saídas: LL (TipoLista)

IL, FL (inteiro) Sucesso (lógico)

Variável 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

Algoritmo:

(30)

Inserção como último nodo da LL

LL não termina no final do arranjo

1 2 3 4 6 7 9 10

LL

IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir no final

(31)

Inserção como último nodo da LL

LL não termina no final do arranjo

1 2 3 4 6 7 9 10

LL

IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 L7 5 8 Inserir no final Novo nodo

(32)

Inserção como último nodo da LL

LL termina no final do arranjo

1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir no final

(33)

Inserção como último nodo da LL

LL termina no final do arranjo

1 2 3 4 6 7 9 10 LL L1 L2 L3 L4 L5 L6 5 8 1 2 3 4 6 7 9 10 LL L1 L2 L3 L4 L5 L6 L7 5 8 IL IA FLFA Inserir no final IL FL IA FA Novo nodo

(34)

Algoritmo 3.3 - InserirFimLLArr Entradas: LL (TipoLista)

IA, FA, IL, FL (inteiro) InfoNodo (TipoNodo)

Saídas: LL (TipoLista)

IL, FL (inteiro) Sucesso (lógico)

Variável auxiliar: Ind (inteiro)

início

se (IA = IL) e (FA = FL) então Sucesso  falso

senão início se IL = 0 {LISTA VAZIA}

então IL  FL  IA

senão se FL < FA {TEM ESPAÇO ATRÁS}

então FL  FL+1

senão início {DESLOCAR NODOS PARA BAIXO}

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

Algoritmo:

Algoritmo:

(35)

Inserção no meio de LL

1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 Inserir Posição: 3o nodo

(36)

Inserção no meio de LL

1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 1 2 3 4 6 7 9 10 LL L1 L2 L3 L4 L5 L6 5 8 IL FL IA FA Inserir Posição: 3o nodo Novo nodo

(37)

Algoritmo:

Algoritmo:

Inserir em LL implementada sobre Arranjo na Posição K

Posição K

• K = 1 → no início da LL

• K = FL – IL + 2 → no final da lista

Caso haja deslocamento

• para cima, caso haja espaço • senão, para baixo

Sucesso retorna falso quando

• não existe espaço no arranjo para a

inserção

(38)

Algoritmo:

Algoritmo:

Inserir em LL implementada sobre Arranjo na Posição K

Algoritmo 3.4 - InserirLLArrPosK 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)

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 IL  FL  IA senão se FL  FA

então início {DESLOCAR NODOS PARA CIMA}

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 BAIXO}

para Ind de IL incr 1 até IL+K-2 faça LL[Ind-1]  LL[Ind] IL  IL - 1 fim LL[IL+K-1]  InfoNodo Sucesso  verdadeiro fim

(39)

Otimizar:

deslocar nodos da metade para o fim se a inserção for na primeira metade

da lista, e da metade para o início se for na segunda metade

→ desde que haja espaço no lado considerado

40 20 90 80 70 0 1 2 3 4 5 6 7 Início Fim 8 9 K ≤ 3 K > 3

Algoritmo:

Algoritmo:

(40)

Algoritmo 3.5 - InserirLLArrPosKOt 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)

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 IL  FL  (FA-IA+1) div 2 {INSERE NO MEIO}

senão se IL = IA ou ((FL  FA) e (K > (FL-IL+2/2)) então início {DESLOCAMENTO PARA CIMA}

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 {DESLOCAMENTO PARA BAIXO}

para Ind de IL incr 1 até IL+K-2 faça LL[Ind-1]  LL[Ind] IL  IL - 1 fim LL[IL+K-1]  InfoNodo Sucesso  verdadeiro fim

Algoritmo

Algoritmo

otimizado

otimizado

:

:

(41)

Remoção de um nodo

LL 1 2 3 4 6 7 9 10 IL FL IA FA L1 L2 L3 L4 L5 5 8 Remover 3o nodo

(42)

Remoção de um nodo

1 2 3 4 6 7 9 10

LL

IL FL IA FA L1 L2 L3 L4 L5 5 8 1 2 3 4 6 7 9 10

LL

L1 L2 L3 L4 5 8 IL FL IA FA Remover 3o nodo

(43)

Algoritmo 3.6 -

RemoverKLLArr

Entradas: LL (TipoLista) IL, FL (inteiro) K (inteiro) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico)

Variável auxiliar: Ind (inteiro)

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-1 faça LL[Ind]  LL[Ind+1] FL  FL-1 se FL = IL–1 então IL  FL  0 Sucesso  verdadeiro fim fim

(44)

Deslocar nodos da metade para baixo se o nodo a ser removido estiver na

primeira metade da lista, e da metade para cima se estiver na segunda metade

desde que haja espaço no lado considerado

Otimização da remoção de um nodo

Remover K=2 40 20 90 80 70 23 1 2 3 4 5 6 7 8 9 10 K3 K > 3 70 20 90 80 23 1 2 3 4 5 6 7 8 9 10 IL IL FL FL

(45)

Acessar para Consulta a informações do nodo

Alteração de algum campo de informação do nodo

(46)

Acesso a um nodo

O nodo a ser acessado pode ser identificado por

• sua ordem na lista Ex: 2º nodo

• através de seu conteúdo Ex: nodo de conteúdo “D”

1 2 3 4 6 7 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 1 2 3 4 6 7 9 10 LL IL FL IA FA A B C D E 5 8

(47)

Algoritmo 3.7 - AcessarKLLArr Entradas: LL (TipoLista) IL, FL (inteiro) K (inteiro)

Saídas: 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

Algoritmo:

Algoritmo:

(48)

Algoritmo 3.8 - PosValLLArr Entradas: LL (TipoLista) IL, FL (inteiro) ValBuscado (TipoValor) Saída: Posição(inteiro) Variáveis auxiliares: I (inteiro) Achou (lógico) 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 Achou  verdadeiro fim senão I  I+1 fim TipoNodo = registro Valor: inteiro Info: TipoInfo fim registro

Algoritmo:

Algoritmo:

(49)

Algoritmo 3.9 -

PosValLLArrOrd

Entradas: LL (TipoLista) IL, FL (inteiro) ValBuscado (TipoNodo) Saídas: Posição(inteiro) Variáveis auxiliares:

Meio, Inf, Sup (inteiro) Achou (lógico) 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 {DIVISÃO INTEIRA}

se LL[Meio].Valor = ValBuscado então início

Posição  Meio

Achou  verdadeiro fim

senão se LL[Meio].Valor < ValBuscado

então Inf  Meio+1 {BUSCA SEGUE SÓ NA METADE SUPERIOR}

senão Sup  Meio–1 {BUSCA SEGUE SÓ NA METADE INFERIOR}

fim fim

(50)

Listas lineares

(51)

Descritor contém diversas informações sobre a lista linear :

• localização da lista no arranjo (índices)

• acesso – índice de alguns nodos

• estrutura da lista, como número de nodos

• conteúdo • ...

Descritor de uma LL

6 7 8 9 10 3 4 5 1 2 11 12 13 4 2 5 1 7 9 6 7 4 3 8 Descritor

(52)

1 2 3 4 6 7 9

10

LL 7 9 2 5 1 4 5 8 2 1 4 5 3 8 6 7 4 3 Comprimento da lista Último nodo Primeiro nodo

Nodo com menor valor

Nodo com maior valor

DescrLL

(53)

TipoNodo = registro

Valor: inteiro Info: TipoInfo fim registro

• Sempre através das informações contidas no descritor

LL[DescrLL [1]].Info – informação contida no primeiro nodo da lista LL[DescrLL [2]].Valor – Valor contido no último nodo da lista

LL[DescrLL [5]].Valor – maior Valor contido na lista

DescrLL [3] – comprimento da lista. A informação está contida diretamente no descritor,

não sendo necessário percorrer a lista para obter seu comprimento 2 1 4 5 3 8 6 7 4 3 Comprimento da lista Último nodo Primeiro nodo

Nodo com menor valor

Nodo com maior valor

DescrLL TipoDescritor =

arranjo [1..5] de inteiros

(54)

Acesso a LL com descritor

TipoNodo = registro

Valor: inteiro Info: TipoInfo fim registro

LL[DL.IL].Info – informação contida no primeiro nodo da lista; LL[DL.FL].Valor – valor contido no último nodo da lista;

DL.MaiorValor – maior valor contido no campo Valor de todos os nodos da lista.

TipoDescritor = registro IL: inteiro FL: inteiro MaiorValor: inteiro fim registro Ex 2: FL IL 3 8 4 MaiorValor

Índice do maior valor da lista Final da lista Início da lista DescrLL 6 7 8 9 10 3 4 5 1 2 11 12 13 4 2 5 1 7 9

(55)

Descritor utilizado nos algoritmos

TipoDescr = registro IA : inteiro IL : inteiro N : inteiro FL : inteiro FA : inteiro fim registro IL IA FL FA 1 3 6 8 13 N Comprimento da lista Início da lista Início do arranjo Final da lista Final do arranjo DescrLL 6 7 8 9 10 3 4 5 1 2 11 12 13 4 2 5 1 7 9

(56)

Descritor informando espaço disponível para

a lista no arranjo

16 17 18 19 20 13 14 15 11 12 21 22 23 IA IL N FL FA 22 12 13 6 18 X DLista

(57)

Duas LL implementadas sobre o mesmo arranjo,

com descritores

9 IA IL N FL FA 18 20 5 24 24 10 11 4 14 17 14 15 16 17 18 11 12 13 10 19 20 21 IA IL N FL FA 22 23 24 25 26 27

(58)

• Inicializar lista

Inserir nodo (início / meio / final)

Remover nodo (início / meio / final)

Localizar determinado nodo

Algoritmos para operações em LL com descritores -

contiguidade física

(59)

Criação de LL vazia com descritor

11 12 13 14 16 17 19 20 LL 15 18 IL IA FL FA 11 0 0 0 20 N DL IL IA FL FA 11 10 0 10 20 N DL (Opção 1) (Opção 2) 2 estratégias

(60)

Algoritmo:

Algoritmo:

Inicializar LL sobre Arranjo com Descritor

Algoritmo 3.10 - InicLLArrDescr

Entradas: DL (TipoDescr)

IniArea, FimArea (inteiro) Saída: DL (TipoDescr) início DL.IL  0 DL.FL  0 DL.N  0 DL.IA  IniArea DL.FA  FimArea fim

(61)

Inserir novo nodo LL com descritor –

contiguidade física

IA IL N FL FA 23 11 13 6 18 16 17 18 19 20 13 14 15 11 12 21 22 23 A No início 16 17 18 19 20 13 14 15 11 12 21 22 23 A No final 16 17 18 19 20 13 14 15 11 12 21 22 23 A No meio

(62)

Inserção no início da lista

IL IA FL FA 1 3 4 6 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 1 2 5 6 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 Inserir no início Novo nodo Valores alterados no descritor

(63)

Inserção no início com deslocamento

IL IA FL FA 1 1 5 5 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 1 6 6 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 1 Inserir no início Novo nodo Valores alterados no descritor

(64)

Inserção no final da lista

Valores alterados no descritor IL IA FL FA 1 3 4 6 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 1 3 5 7 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 Inserir no final Novo nodo

(65)

Inserção no final com deslocamento

IL IA FL FA 1 6 5 10 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 5 6 10 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 1 Inserir no final Novo nodo Valores alterados no descritor

(66)

Inserção no meio da lista

IL IA FL FA 1 3 5 7 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 3 6 8 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 1 Inserir como 3º nodo Novo nodo Valores alterados no descritor

(67)

Algoritmo 3.11 - InserirLLArrDesc

Entradas: LL (TipoLista) Saídas: LL (TipoLista) DL (TipoDescr) DL (TipoDescr)

Pos (inteiro) Info (TipoNodo) Variáveis auxiliares: Sucesso (lógico) K (inteiro)

IndPos (inteiro) início

se (DL.N = DL.FA-DL.IA+1) ou (Pos > DL.N+1) ou (Pos < 1) então Sucesso  falso

senão início

Sucesso  verdadeiro DL.N  DL.N + 1

se Pos = 1 {INSERIR NO INÍCIO}

então início se DL.N = 1 então início

DL.IL  (DL.FA-DL.IA+1) div 2 DL.FL  DL.IL

fim

senão se DL.IL > DL.IA

então DL.IL  DL.IL-1 senão início

para K de DL.FL até DL.IL incr-1 faça LL[K+1]  LL[K]

DL.FL  DL.FL+1 fim

LL[DL.IL]  Info fim

(68)

senão se Pos = DL.N {INSERIR COMO ÚLTIMO}

então início

se DL.FL < DL.FA

então DL.FL  DL.FL+1 senão início

para K de DL.IL até DL.FL faça LL[K-1]  LL[K]

DL.IL  DL.IL-1 fim

LL[DL.FL]  Info fim

senão início {INSERIR NO MEIO}

se DL.FL < DL.FA então início

IndPos  DL.IL+Pos-1

para K de DL.FL até IndPos incr-1 faça LL[K+1]  LL[K]

DL.FL  DL.FL+1 fim

senão início

IndPos  DL.IL+Pos-2

para K de DL.IL até IndPos faça LL[K-1]  LL[K] DL.IL  DL.IL–1 fim LL[IndPos]  Info fim

Algoritmo (cont):

(69)

Remoção de um nodo

16 17 18 19 20 13 14 15 11 12 21 22 23 A Do início 16 17 18 19 20 13 14 15 11 12 21 22 23 A Do final 16 17 18 19 20 13 14 15 11 12 21 22 23 A Do meio IA IL N FL FA 23 11 13 6 18 Deslocamento OU

(70)

Inserção do início da LL

IL IA FL FA 1 2 5 6 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 1 3 4 6 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 Remover o primeiro Valores alterados no descritor

(71)

Remoção do final da lista

IL IA FL FA 1 3 4 6 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 1 3 3 5 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 Remover o último Valores alterados no descritor

(72)

Remoção no meio da lista

IL IA FL FA 1 3 5 7 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 4 4 7 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 1 Remover 2º nodo Valores alterados no descritor

(73)

Remoção resultando em LL vazia

IL IA FL FA 1 4 1 4 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 IL IA FL FA 0 0 0 10 N DL 1 2 3 4 6 7 9 10 LL 5 8 1 Remover nodo Valores alterados no descritor

(74)

Algoritmo:

Algoritmo:

Remover k-ésimo nodo de LL sobre Arranjo com Descritor

Algoritmo 3.12 -

RemoverKLLArrDesc

Entradas: LL (TipoLista) DL (TipoDescr) K (inteiro) Saídas: LL (TipoLista) DL (TipoDescr) Sucesso (lógico)

Variável auxiliar: Ind (inteiro)

início

se (K  0) ou (K > DL.N) então Sucesso  falso senão início

Sucesso  verdadeiro

para Ind de DL.IL+K-1 até DL.FL-1 faça LL[Ind]  LL[Ind+1] DL.FL  DL.FL-1 DL.N  DL.N-1 se DL.FL = DL.IL–1 então DL.IL  DL.FL  0 fim fim

(75)

Acesso a um nodo da lista

Nodo identificado por:

• sua posição na lista – k-ésimo nodo • campo de informação

(76)

Algoritmo:

Algoritmo:

Acessar k-ésimo nodo de LL sobre Arranjo com Descritor

Algoritmo 3.13 - AcessarKLLArrDesc

Entradas: LL (TipoLista) DL (TipoDescr)

K (inteiro)

Saídas: InfoNodo (TipoNodo)

Sucesso (lógico) início

se (K  0) ou (K > DL.FL-DL.IL+1) ou (DL.N = 0) então Sucesso  falso

senão início

InfoNodo  LL[DL.IL+K-1] Sucesso  verdadeiro

fim fim

(77)

Informar Posição do nodo com determinado Valor

em LL sobre Arranjo com Descritor

Algoritmo 3.14 - PosValLLArrDesc

Entradas: LL (TipoLista) DL (TipoDescr)

ValBuscado (TipoValor)

Saída: Posição (inteiro) Variáveis auxiliares: I (inteiro) Achou (lógico) início Achou  falso Posição  0 I  DL.IL

enquanto (I  DL.FL) e (não Achou) faça se LL[I].Valor = Val

então início Posição  I Achou  verdadeiro fim senão I  I+1 fim

(78)

Listas lineares

(79)

1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L1 L2 5 8 Início da LL Final da LL

(80)

• Inicializar lista

Inserir nodo (início / meio / final)

Remover nodo (início / meio / final)

Localizar determinado nodo

Operações

Igual a quando não é feita a ocupação circular do arranjo

(81)

Inserção de um novo nodo

1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L1 L2 5 8 1 2 3 4 6 7 9 10 LL IL FL IA FA L4 L5 L6 L7 L1 L2 L3 5 8 1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L1 L2 5 8 1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L7 L1 L2 5 8 No final No início

(82)

Inserção de um novo nodo

1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L1 L2 5 8 1 2 3 4 6 7 9 10 LL L3 L4 L5 L6 L7 L1 L2 5 8 IL FL IA FA Inserir como 5º nodo da LL Novo nodo

No

me

io

(83)

Entradas: LL (TipoLista) Saídas: LL (TipoLista) IA, FA, IL, FL (inteiro) IL, FL (inteiro)

K (inteiro) Sucesso (lógico) InfoNodo (TipoNodo)

Variáveis auxiliares: Ind, N, Pos (inteiro)

início

se IL = 0 {LISTA VAZIA}

então N  0

senão se IL  FL

então N  FL-IL+1

senão N  (FA-IL+1) + (FL-IA+1)

se (N = FA-IA+1) ou (K > N+1) ou (K < 1) ou (N=0 e K1) então Sucesso  falso

senão início

se (N = 0)

então início {PRIMEIRO NODO}

Pos  IA

IL  FL  IA fim

senão início

se (IL+K-1  FA) então Pos  IL+K-1

senão Pos  (IA-1) + (K - (FA-IL+1)) se K = 1 {INSERÇÃO NO INÍCIO} então se IL > IA então início Pos  IL-1 IL  IL-1 fim senão início IL  FA Pos  FA

(84)

senão se K = N+1 {INSERÇÃO NO FINAL}

então se Pos = FL+1

então FL  FL+1 senão FL  IA senão {INSERÇÃO NO MEIO}

se (IL  FL) e (FL < FA)

ou (IL > FL) e (Pos < IL) então início

para Ind de FL incr-1 até Pos faça LL[Ind+1]  LL[Ind]

FL  FL+1 fim

senão início se FL  FA

então para Ind de FL incr-1 até IA faça LL[Ind+1]  LL[Ind]

LL[IA]  LL[FA]

para Ind de FA-1 incr-1 até Pos faça LL[Ind+1]  LL[Ind] se FL = FA então FL  IA senão FL  FL+1 fim fim LL[Pos]  InfoNodo Sucesso  verdadeiro

Algoritmo (cont):

(85)

Remoção de um nodo

1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L1 L2 5 8 1 2 3 4 6 7 9 10 LL I L FL IA FA L2 L3 L4 57 L1 5 8 1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L1 L2 5 8 1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L1 L2 5 8 No final No início

(86)

Remoção de um nodo

1 2 3 4 6 7 9 10 LL IL FL IA FA L3 L4 L5 L6 L1 L2 5 8 1 2 3 4 6 7 9 10 LL L3 L4 L5 L1 L2 5 8 IL FL IA FA Remover 4º nodo da LL No me io

(87)

Algoritmo 3.16 -

RemoverKLLCirArr

Entradas: LL (TipoLista)

IA, FA, IL, FL (inteiro)

K (inteiro)

InfoNodo (TipoNodo)

Saídas: LL (TipoLista) IL, FL (inteiro)

Sucesso (lógico)

Variáveis auxiliares: Ind, N, Pos (inteiro)

início

se IL = 0 {LISTA VAZIA}

então N  0

senão se IL  FL

então N  FL-IL+1

senão N  (FA-IL+1) + (FL-IA+1) se (N = 0) ou (K  0) ou (K > N)

então Sucesso  falso senão início

se N = 1 {REMOÇÃO DO ÚNICO}

então IL  FL  0

senão se K = 1 {REMOÇÃO DO PRIMEIRO}

então se IL < FA

então IL  IL+1 senão IL  IA

(88)

Algoritmo (cont):

Algoritmo (cont): Remover nodo Posição K da LL Circular sobre Arranjo

senão se K = N {REMOÇÃO DO ÚLTIMO}

então se FL = IA

então FL  FA senão FL  FL-1

senão início {REMOÇÃO NO MEIO}

se (IL+K-1  FA) então Pos  IL+K-1

senão Pos  IA + (K - (FA-IL+1)-1)

se (IL < FL) ou ((IL>FL) e (K>=FA-IL+2)) então início

para Ind de Pos até FL-1

faça LL[Ind]  LL[Ind+1] FL  FL-1

fim

senão início

para Ind de Pos+1 até FA

faça LL[Ind-1]  LL[Ind] LL[FA]  LL[IA]

se FL  IA

então para Ind de IA+1 até FL

faça LL[Ind-1]  LL[Ind] se FL = IA então FL  FA senão FL  FL-1 fim fim Sucesso  verdadeiro fim

(89)

Acesso a um novo nodo

1 2 3 4 6 7 9 10 LL IL FL IA FA C L3 D L4 E L5 F L6 A L1 B L2 5 8

Acessar 3º nodo da lista

(90)

Algoritmo:

Algoritmo: Acessar k-ésimo nodo da LL Circular sobre Arranjo

Algoritmo 3.17 - AcessarKLLCirArr

Entradas: LL (TipoLista)

IA, FA, IL, FL (inteiro)

K (inteiro)

Saídas: InfoNodo (TipoNodo)

Sucesso (lógico)

Variáveis auxiliares: N, Pos (inteiro)

início

se IL = 0 {LISTA VAZIA}

então N  0

senão se IL  FL

então N  FL-IL+1

senão N  (FA-IL+1) + (FL-IA+1) se (N = 0) ou (K  0) ou (K > N)

então Sucesso  falso senão início

se (IL+K-1  FA) então Pos  IL+K-1

senão Pos  IA + (K - (FA-IL+1)-1) InfoNodo  LL[Pos]

Sucesso  verdadeiro fim

(91)

Entradas: LL (TipoLista) Saída: Posição (inteiro) IA, FA, IL, FL (inteiro) Variáveis auxiliares: ValBuscado (TipoValor) N, I (inteiro)

Achou, Sair (lógico) início Achou  falso Posição  0 se IL = 0 {LISTA VAZIA} então N  0 senão se IL  FL então N  FL-IL+1

senão N  (FA-IL+1) + (FL-IA+1) se N  0

então início I  IL

Sair  falso

enquanto (não Achou) e (não Sair) faça se LL[I].Valor = Val

então início

Posição  I

Achou  verdadeiro fim

senão se I = FL

então Sair  verdadeiro senão se I  FA

então I  I+1 senão I  IA fim fim

(92)

Listas lineares

(93)

• Ordem dos nodos da lista definida por informação contida

em cada nodo

• Ordem independe da posição física dos nodos

Contiguidade lógica dos nodos na LL

Campo de elo

contido em cada nodo

informa qual o próximo nodo da lista

(94)

Requisitos para LL encadeada

• Ponteiro para o primeiro nodo da lista

Encadeamento entre os nodos através de campo de elo

Indicação de final de lista

L1 L2 L3 L4

PtLista

Li

Info Elo

(95)

Operações básicas

• Criar e inicializar uma lista

• Inserir novo nodo

• Remover um nodo

• Acessar um nodo

• Destruir lista

Algoritmos

Algoritmos

Tipos de dados utilizados nos algoritmos:

TipoPtNodo = TipoNodo TipoNodo = registro

Info: TipoInfoNodo Elo : TipoPtNodo fim registro

(96)

Criação de LL encadeada

• Inicializar apontador do início da lista em endereço nulo

Lista inicialmente vazia

L1 L2 L3 L4 PtLista

PtLista

(97)

Algoritmo:

Algoritmo: Inicializar LL Encadeada

Algoritmo 3.19 - InicializarLLEnc

Entradas:

Saída: PtLista (TipoPtNodo)

início

PtLista  nulo fim

(98)

Inserção de um novo nodo

Inserção de um novo nodo

• Alocar o novo nodo

Preencher com valor

Encadear na posição solicitada

• No início da lista (primeiro nodo)

No final da lista (último nodo)

(99)

Inserção no início de LL encadeada

L1 L2 L3 PtLista L2 L3 L4 PtLista L1 Novo nodo

(100)

Algoritmo 3.20 - InserirIniLLEnc Entradas: PtLista (TipoPtNodo) Dados (TipoInfoNodo) Saídas: PtLista (TipoPtNodo) Sucesso (lógico)

Variável auxiliar: Pt (TipoPtNodo)

início

alocar(Pt)

se Pt = nulo

então Sucesso  falso senão início Sucesso  verdadeiro Pt.Info  Dados Pt.Elo  PtLista PtLista  Pt fim fim

Algoritmo:

(101)

Inserção no final de LL encadeada

L1 L2 L3 PtLista L2 L3 L4 PtLista L1 Novo nodo

(102)

Algoritmo 3.21 - InserirFimLLEnc Entradas: PtLista (TipoPtNodo) Dados (TipoInfoNodo) Saídas: PtLista (TipoPtNodo) Sucesso (lógico)

Variáveis auxiliares: P1, P2 (TipoPtNodo)

início

alocar(P1) se P1 = nulo

então Sucesso  falso senão início Sucesso  verdadeiro P1.Info  Dados P1.Elo  nulo se PtLista = nulo então PtLista  P1 senão início P2  PtLista

enquanto P2.Elo  nulo faça P2  P2.Elo P2.Elo  P1 fim fim fim

Algoritmo:

(103)

Inserção no meio de LL encadeada

L1 L2 L3 L1 L2 L4 L3 PtLista PtLista

Novo nodo

Percorrer a lista a partir do primeiro nodo até a posição de inserção

(104)

Algoritmo 3.22 - InserirKLLEnc Entradas: PtLista (TipoPtNodo) K (inteiro)

Dados (TipoInfoNodo) Saídas: PtLista (TipoPtNodo)

Sucesso (lógico)

Variáveis auxiliares: PAnt, PtNovo (TipoPtNodo)

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.Elo  PtLista PtLista  PtNovo Sucesso  verdadeiro fim

Algoritmo:

(105)

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 fim

(106)

Remoção de um nodo

• Localizar o nodo a ser removido

Atualizar encadeamento da lista

Liberar espaço ocupado pelo nodo

• Se for o último nodo da lista → lista fica vazia

(107)

Remoção de um nodo

L1 L2 L3 L4

PtLista

L1 L2 L3

PtLista

(108)

Algoritmo 3.23 - RemoverKLLEnc Entradas: PtLista (TipoPtNodo) K (inteiro)

Saídas: PtLista (TipoPtNodo) Sucesso (lógico)

Variáveis auxiliares: PtAnt, PtK (TipoPtNodo)

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  PtLista.Elo senão PtAnt.Elo  PtK.Elo liberar(PtK)

Sucesso  verdadeiro fim fim fim

Algoritmo:

(109)

Acesso a um nodo

• Nodos não podem ser acessados diretamente

Percorrer a lista até encontrar o nodo buscado

Nodo identificado por

• sua posição na lista • conteúdo

L1 L2 L3 L4 PtLista

(110)

Algoritmo:

Algoritmo: Acessar K-ésimo nodo de LL Encadeada

Algoritmo 3.24 - AcessarKLLEnc

Entradas: PtLista (TipoPtNodo) K (inteiro) Saída: PtK (TipoPtNodo) 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 fim

(111)

Destruir lista

• Percorrer lista a partir do primeiro nodo

• Liberar todos os nodos da lista

(112)

Algoritmo:

Algoritmo: Destruir LL Encadeada

Algoritmo 3.25 - DestruirLLEnc

Entrada: PtLista (TipoPtNodo) Saída: PtLista (TipoPtNodo)

Variável auxiliar: Pt (TipoPtNodo)

begin

enquanto PtLista  nulo faça início Pt  PtLista PtLista  PtLista.Elo liberar(Pt) fim liberar(PtLista) fim

(113)
(114)

LL encadeada circular

• Elo do último nodo indica endereço do primeiro

Lista pode ser percorrida a partir de qualquer nodo

• Lista com 1 só nodo: elo do nodo aponta para ele

mesmo

L1 L2 L3 L4

PtLista

PtLista

(115)

Operações básicas

• Criar uma lista

• Inserir novo nodo

• Remover um nodo

• Acessar um nodo

• Destruir lista

Algoritmos

Algoritmos

(116)

Inserção de um novo nodo

• Localizar posição de inserção

• Alocar o novo nodo

Preencher com valor

Encadear adequadamente L1 L2 L3 L4 PtLista L1 L2 L3 L4 PtLista L5

(117)

Algoritmo 3.26 - InserirKLLEncCir Entradas: PtLista (TipoPtNodo) K (inteiro)

Dados (TipoInfoNodo) Saídas: PtLista (TipoPtNodo) Sucesso (lógico)

Variáveis auxiliares: PtAnt, PtNovo (TipoPtNodo)

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 início Sucesso  verdadeiro PtNovo.Info  Dados

se K = 1 {INSERE COMO PRMEIRO} { então início SEGUE }

Algoritmo:

Algoritmo:

(118)

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 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 {ORDEM FORA DA LISTA}

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

Algoritmo (cont):

(119)

Remoção de um nodo

L1 L2 L3 L4 PtLista L1 L2 L3 PtLista Remover

• Localizar posição do nodo

• Adequar encadeamentos

(120)

Algoritmo 3.27 - RemoverKLLEncCir

Entradas: PtLista (TipoPtNodo) K (inteiro)

Saídas: PtLista (TipoPtNodo) Sucesso (lógico)

Variáveis auxiliares: PtAnt, PtK (TipoPtNodo)

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 SEGUE }

Algoritmo:

(121)

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 {ORDEM FORA DA LISTA}

então Sucesso  falso senão início PtK  PtAnt.Elo PtAnt.Elo  PtK.Elo liberar(PtK) fim fim fim fim

(122)

Acesso à lista

• Iniciar sempre acessando primeiro nodo da lista

• Seguir acessando de acordo com campos de elo

• Para quando encontrar novamente o primeiro nodo da lista

L1 L2 L3 L4

PtLista

L5

A seguir: algoritmo que acessa todos os nodos de uma LL encadeada circular, imprimindo o campo de informação de todos os nodos acessados

(123)

Algoritmo 3.28 - ImprimirLLEncCir Entrada: PtLista (TipoPtNodo) Saídas:

Variável auxiliar: PtAux (TipoPtNodo)

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

Algoritmo:

Algoritmo:

(124)

Listas lineares

(125)

PtLista

L1 L2 L3 L4

• Cada nodo tem 2 campos de elo

• A lista pode ser percorrida nas duas direções

LL duplamente encadeadas

Anterior

Info

Próximo

(126)

Operações

• Criar e inicializar uma lista

• Inserir novo nodo

• Remover um nodo

• Acessar um nodo

• Destruir lista

Algoritmos

Semelhantes a LL encadeada simples

Tipo de nodo utilizado nos algoritmos:

TipoNodo = registro

Ant: TipoPtNodo Info: TipoInfoNodo Prox: TipoPtNodo

Referências

Documentos relacionados

Deve-se começar por confirmar o correto preenchimento dos seguintes campos, para verificar a validade da receita: número da receita; local de prescrição; identificação

Assim, é de salientar a redução do abandono escolar, muito significativa no ensino secundário, profissional e cursos científico-humanísticos; o aumento da taxa global de

vários graus de acentuação nas demais ilhas. É sabido que este fonema não pertence à pronúncia normal portuguesa. No entanto verifica-se que a sua vitalidade e sua extensão

Objetivo de aprendizagem e desenvolvimento: (EI02CG03) Explorar formas de deslocamento no espaço (pular, saltar, dançar), combinando movimentos e seguindo

Flávia listou dicas de como fazer a introdução alimentar da carne vermelha na ro na da criança e, ao mesmo tempo, tomar vários cuidados para que ela não

Profª Dra Wanderléa Pereira Damásio Maurício(USJ).. Profª Dra Izabel Cristina da Rosa Gomes

Buscando aprofundar as nossas discussões para o ensino de matemática nos primeiros anos do Ensino Fundamental, buscamos fundamentos teóricos nos Parâmetros Curriculares

Nesse novo cenário do comércio mundial, novas problemáticas são levantadas pelos países que desejam aumentar sua participação no comércio internacional como as exportações