Sie sind auf Seite 1von 2

Lista Duplamente Encadeada

http://www.icmc.usp.br/~sce182/ldupenc.html

ndice > Lista > Duplamente Encadeada

Instituto de Cincias Matemticas de So Carlos Departamento de Computao e Estatstica SCE182 - Algoritmos e Estruturas de Dados 1 Profs. Resp.: Graa Pimentel, Maria Cristina e Rosane

Lista Duplamente Encadeada


Caractersticas
Listas foram percorridas do incio ao final. Ponteiro "anterior" necessrio para muitas operaes. Em alguns casos pode-se desejar percorrer uma lista nas duas direes indiferentemente. Nestes casos, o gasto de memria imposto por um novo campo de ponteiro pode ser justificado pela economia em no reprocessar a lista toda.

Type tpont = ^ trec; trec = record info:T; esq, dir: tpont; End; Lista = tpont; Var pont: Lista;

Como consequncia, podemos realizar as operaes de insero e eliminao esquerda ou direita de um campo no interior de uma lista sem a necessidade de ponteiros "anteriores".

Implementao de algumas opraes de lista duplamente encadeada com alocao dinmica


As operaes 1 a 4 abaixo so atmicas, isto , elas realizam a reserva de espao (quando necessria) alm do 'acerto dos ponteiros'. Pr-condio para todas elas que se conhea o ponteiro de um n ou de um vizinho. Alm disso, elas no tratam casos especiais. Assim, elas so operaes de suporte para as inseres e eliminaes do TAD Lista, quando este implementado por lista duplamente encadeada. Tais operaes no ficariam disponveis para o 'usurio' da TAD. Apenas o projetista do tipo abstrato de dados as usa no desenvolvimento dos algoritmos genricos de insero e eliminao (isto , aqueles que tratam todos os casos, alm das condies de erro). 1) Insero direita de pont
Procedure ins_dir (pont: lista; x: T); Var j: Lista; Begin new(j); j^.info:=x; j^.dir:=pont^.dir; j^.dir^.esq:=j; j^.esq:=pont; pont^.dir:=j; End;

1 de 2

25/2/2008 20:01

Lista Duplamente Encadeada

http://www.icmc.usp.br/~sce182/ldupenc.html

2) Insero esquerda de pont


Procedure ins_esq (pont: Lista; x: T); Var j: Lista; Begin new(j); j^.info:=x; j^.dir:=pont; j^.esq:=pont^.esq; j^.esq^.dir:=j; pont^.esq:=j; End;

3) Eliminao direita de pont


Procedure elim_dir (pont: Lista); Var j: Lista; Begin j:=pont^.dir; pont^.dir:=j^.dir; j^.dir^.esq:=pont; dispose(j); End;

4) Eliminao do prprio pont


Procedure elim (Var pont: Lista); Begin pont^.dir^.esq:=pont^.esq; pont^.esq^.dir:=pont^.dir; dispose(pont); End;

5) Busca em uma lista circular

Funtion Busca_Dup_Ord(ptlista: Lista; x: T):Lista; { Lista Duplamente Encadeada Ordenada com sentinela apontado por ptlista } Var pont, ultimo: Lista; Begin ultimo:=ptlista^.esq; If x<=ultimo^.info then Begin pont:=ptlista; While pont^.info < x do pont:=pont^.dir; Busca_Dup_Ord:=pont; End Else Busca_Dup_Ord:=ptlista; End; -> Faa a Busca em lista duplamente encadeada simples (no circular).

Exerccio

Lista Dinmica
2 de 2 25/2/2008 20:01

Das könnte Ihnen auch gefallen