A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

LISTAS DUPLAMENTE ENCADEADAS. Listas Encadeadas: Características Listas encadeadas são percorridas do início ao final. E se for necessário percorrer uma.

Apresentações semelhantes


Apresentação em tema: "LISTAS DUPLAMENTE ENCADEADAS. Listas Encadeadas: Características Listas encadeadas são percorridas do início ao final. E se for necessário percorrer uma."— Transcrição da apresentação:

1 LISTAS DUPLAMENTE ENCADEADAS

2 Listas Encadeadas: Características Listas encadeadas são percorridas do início ao final. E se for necessário percorrer uma lista nas duas direções indiferentemente? –Ex.: Ponteiro para o nó anterior" necessário para muitas operações (busca, inserção,...) Utilização de um ponteiro extra em cada nó, que indica o ponteiro anterior ao nó O gasto de memória imposto por um novo campo de ponteiro é justificado pela facilidade no processa- mento de toda lista

3 Implementação de Listas com Ponteiros Os nós (itens) da lista são registros com dois ponteiros, para guardar o endereço do seu sucessor e antecessor... x2x2 x3x3 xnxn x1x1 Antecessor (esq) Sucessor (dir) x1x1

4 Implementação da Lista Duplamente Encadeada type Ponteiro = ^TipoNo; TipoItem = record chave: TipoChave; {outros componentes desejadas...} end; TipoNo = record Item: TipoItem; Ant, Prox: Ponteiro; end; TipoListaDupla = record Primeiro: Ponteiro; Último: Ponteiro; end; var L: TipoListaDupla;

5 Implementação: Inicia_Lista e Lista_Vazia procedure Inicia_Lista (var LD: TipoListaDupla); begin New (LD.Primeiro); LD.Último := LD.Primeiro; LD.Primeiro^.Prox := nil;{LD.Último^.Prox := nil} LD.Primeiro^.Ant := nil;{LD.Último^.Ant := nil} end; function Lista_Vazia (var LD: TipoListaDupla): boolean; begin Lista_Vazia := LD.Último = LD.Primeiro; end;

6 Implementação: Imprime_Lista procedure Imprime_Lista(var LD: TipoLista); var Aux: Ponteiro; begin Aux:= LD.Primeiro^.Prox; while (Aux <> nil) do begin writeln (Chave:, Aux^.Item.Chave); Aux := Aux^.Dir; end;

7 Implementação: Imprime_Lista procedure Imprime_Lista(var LD: TipoLista); var Aux: Ponteiro; begin Aux:= LD.Ultimo; while (Aux <> LD.Primeiro) do begin writeln (Chave:, Aux^.Item.Chave); Aux := Aux^.Esq; end;

8 Inserção de um Nó Duas situações: Inserção à Direita de um nó e Inserção à Esquerda de um Nó Caso 1: Inserção à Direita –Procedimento recebe o nó à esquerda do qual se deseja inserir (o item vai ser inserido à direita desse nó passado como parâmetro) –Cria-se um novo nó –Ponteiro à direita do novo nó recebe o ponteiro à direita do nó passado como parâmetro –Ponteiro à esquerda do novo nó recebe o ponteiro passado como parâmetro –Ponteiro à direita do nó passado como parâmetro recebe o novo nó –Ponteiro à esquerda do nó à direita do novo nó recebe o novo nó

9 Inserção do Nó X à direita de P em Lista Duplamente Encadeada cabeça P X Primeiro Último

10 Inserção à direita de p procedure Insere_a_Direita (p:Ponteiro; x:TipoItem; var LD:TipoListaDupla; var flag: boolean); {O nó será inserido à direita do ponteiro p passado como parâmetro} var pNovo: Ponteiro; begin new(pNovo); if pNovo = nil then flag := FALSE else begin pNovo^.Item.chave := x.chave; pNovo^.Prox := p^.Prox; pNovo^.Ant := p; p^.Prox := pNovo; if pNovo^.prox = nil then LD.Ultimo := pNovo else pNovo^.Prox^.Esq := pNovo; flag := TRUE; end end; {Caso em que p aponta para o último elemento, então o novo elemento será o último da lista}

11 Inserção de um Nó Caso 2: Inserção à Esquerda –Procedimento recebe o nó à direita do qual se deseja inserir (o item vai ser inserido à esquerda desse nó passado como parâmetro) –Cria-se um novo nó –Ponteiro à esquerda do novo nó recebe o ponteiro à esquerda do nó passado como parâmetro –Ponteiro à direita do novo nó recebe o ponteiro passado como parâmetro –Ponteiro à esquerda do nó passado como parâmetro recebe o novo nó –Ponteiro à direita do nó à esquerda do novo nó recebe o novo nó

12 Inserção do Nó X à esquerda de P em Lista Duplamente Encadeada cabeça P X Primeiro Último

13 Inserção à esquerda de p procedure Insere_a_Esquerda (p:Ponteiro; x:TipoItem; var LD:TipoLista; var flag: boolean); { A inserção é feita à esquerda do ponteiro p } var pNovo: Ponteiro; begin new(pNovo); if pNovo = nil or p = LD.Primeiro then flag := FALSE else begin pNovo^.Item := x; pNovo^.Prox := p; pNovo^.Ant := p^.Ant; p^.Ant := pNovo; pNovo^.Esq^.Dir := pNovo; flag := TRUE; end end;

14 Remoção de um Nó Também duas situações: Remoção à Direita de um nó e Remoção à Esquerda de um Nó Caso 1: Remoção à Direita –Procedimento recebe o nó à esquerda do qual se deseja remover(o item vai ser removido à direita desse nó passado como parâmetro) –Cria-se um auxiliar para apontar para o nó à direita –Ponteiro à direita do nó passado como parâmetro aponta para a direita do nó auxiliar –Ponteiro à esquerda do nó à esquerda do nó auxiliar aponta para o nó à esquerda do nó auxiliar –Retorna o ítem que está no nó auxiliar –Apaga-se o nó auxiliar

15 Remoção do Nó X à direita de P em Lista Duplamente Encadeada cabeça P X PrimeiroÚltimo

16 Remoção à direita de p procedure Remove_a_Direita (p:Ponteiro; x:TipoItem; var LD:TipoListaDupla; var flag: boolean); {O nó será removido à direita do ponteiro p passado como parâmetro} var aux: Ponteiro; begin if Vazia(LD) or LD^.prox=nil then flag := false else begin aux := p^.prox; x := aux^.Item; p^.prox := aux^.Prox; if aux^.prox = nil then LD.Ultimo := p else aux^.Prox^.Ant := aux^.Ant; Dispose (aux); flag := TRUE; end end; {Caso em que aux aponta para o último elemento, então o apontador para última posição será P}

17 Remoção à Esquerda de um Nó Caso 2: Remoção à Esquerda –Procedimento recebe o nó à direita do qual se deseja remover(o item vai ser removido à esquerda desse nó passado como parâmetro) –Cria-se um auxiliar para apontar para o nó à esquerda –Ponteiro à esquerda do nó passado como parâmetro aponta para a esquerda do nó auxiliar –Ponteiro à direita do nó à direita do nó auxiliar aponta para o nó à direita do nó auxiliar –Retorna o ítem que está no nó auxiliar –Apaga-se o nó auxiliar

18 Remoção do Nó X à Esquerda de P em Lista Duplamente Encadeada cabeça P X PrimeiroÚltimo

19 Remoção à direita de p procedure Remove_a_Esquerda (p:Ponteiro; x:TipoItem; var LD:TipoListaDupla; var flag: boolean); {O nó será removido à esquerda do ponteiro p passado como parâmetro} var aux: Ponteiro; begin if Vazia(LD) or p=LD.Primeiro then flag := false else begin aux := p^.ant; x := aux^.Item; p^.ant := aux^.ant; aux^.Ant^.Prox := aux^.Prox; Dispose (aux); flag := TRUE; end end;


Carregar ppt "LISTAS DUPLAMENTE ENCADEADAS. Listas Encadeadas: Características Listas encadeadas são percorridas do início ao final. E se for necessário percorrer uma."

Apresentações semelhantes


Anúncios Google