Lista dinámica circular. Inserción y eliminación. function Crear nodo ( x : t i n f o ; var nuevo : tPos ) : boolean ; begin i f Hay memoria then begin new( nuevo ) ; nuevo ˆ . i n f o :=x ; nuevo ˆ . s i g := nuevo ; { Se apunta a s i mismo} Crear nodo : = true ; end e l s e Crear nodo := f a l s e ; end ; function I n s e r t a r ( x : t i n f o ; P : tPos ; var L i s t a : t L i s t a ) : boolean ; {PreCond : P p o s i c i o n v a l i d a en l a l i s t a } var aux : tPos ; begin i f Crear nodo ( x , nuevo ) then begin I n s e r t a r : = true ; i f Es vacia ( Lista ) then L i s t a : = nuevo else begin A n t e r i o r (P , L i s t a ) ˆ . s i g := nuevo ; nuevo ˆ . s i g :=P end end else I n s e r t a r := false ; end ; function Anadir ( x : t i n f o ; var L i s t a : t L i s t a ) : boolean ; var nuevo : tPos ; begin i f Crear nodo ( x , nuevo ) then begin i f Es vacia ( Lista ) then L i s t a : = nuevo e l s e begin nuevo ˆ . s i g : = L i s t a ˆ . s i g ; L i s t a ˆ . s i g : = nuevo ; L i s t a : = nuevo end ; Anadir : = true end e l s e Anadir : = f a l s e ; end ; function E l i m i n a r c o n t e n i d o ( x : t I n f o ; var L i s t a : t L i s t a ) : boolean ; var ant , p : t p o s ; begin i f Es vacia ( Lista ) then E l i m i n a r c o n t e n i d o := f a l s e e l s e begin p:= l i s t a ; i f p ˆ . i n f o=x then begin i f p=p ˆ . s i g { s i s o l o hay un e l e m e n t o } then l i s t a := n u l o e l s e begin l i s t a := a n t e r i o r ( p , L i s t a ) ; l i s t a ˆ . s i g :=p ˆ . s i g ; end dispose (p) ; E l i m i n a r c o n t e n i d o := true ; end e l s e begin { Busca e l e l e m e n t o a b o r r a r . Guarda l a posicion del anterior } while ( p ˆ . i n f o <>x ) and ( p ˆ . s i g <> l i s t a ) do begin ant :=p ; p:=p ˆ . s i g ; end ; i f p ˆ . i n f o <>x then E l i m i n a r c o n t e n i d o := f a l s e e l s e begin ant ˆ . s i g :=p ˆ . s i g ; d i s p o s e (P) ; E l i m i n a r c o n t e n i d o := true ; end end end ;