tpu/u_liscif.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Listas de enteros por cursores, con celdas de
encabezamiento y cursores al final (mucho mejor
que 'u_listci'). keywords: lista, cursores
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: u_liscif.pas,v 1.1 2002/04/25 15:57:09 mstorti Exp mstorti $}
unit u_liscif ;
interface
const
maxlen = 100 ; {longitud del arreglo de cursores}
nyl = 0 ; {equivalente del nil en punteros}
type
tipo_elemento = integer;
posicion = 1..maxlen; {cursor en rango admisible}
L = 1..maxlen; {lista en rango admisible}
t_espacio = array [1..maxlen] of record
elemento : tipo_elemento;
sig : posicion
end;
var
espacio : t_espacio ;
disp : posicion ;
procedure INICIALIZA_NODOS (var espacio : t_espacio) ;
type
liscif = object
private
{ 'ant' apunta a la celda de encabezamiento, 'post' }
ant, post : posicion ;
procedure ERROR (s: string);
function MUEVE (var p, q : posicion): boolean ;
public
procedure INSERTA (x: tipo_elemento; p: posicion);
function LOCALIZA (x: tipo_elemento): posicion;
function RECUPERA (p: posicion) : tipo_elemento;
procedure SUPRIME (var p: posicion);
function SIGUIENTE (p: posicion): posicion;
function ANTERIOR (p: posicion): posicion;
function PRIMERO : posicion;
procedure ANULA ;
function FIN : posicion;
procedure IMPRIME (s : string) ;
end;
implementation
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure liscif.ERROR (s: string);
begin
write ('error: ');
writeln (s);
halt;
end; {ERROR}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure INICIALIZA_NODOS (var espacio : t_espacio) ;
var
i : posicion ;
begin
for i := (maxlen - 1) downto 1 do begin
espacio [i].sig := i + 1 ;
end ; {for}
disp := 1 ;
espacio [maxlen].sig := 0 ;
end ; {INICIALIZA_NODOS}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function liscif.MUEVE (var p, q : posicion) : boolean ;
var { coloca la celda apuntada por p adelante de q}
t : posicion;
begin
MUEVE := false ;
if ( p = nyl ) then
writeln ('celda inexistente')
else begin
MUEVE := true ;
t := q ;
q := p ;
p := espacio [q].sig ;
espacio [q].sig := t ;
end ; {if}
end; {MUEVE}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure liscif.INSERTA (x : tipo_elemento;
p : posicion);
var
q : posicion;
begin
if not MUEVE (disp, espacio [p].sig) then begin
ERROR ('no puede alocar nueva celda');
end ; {if}
{ hace q : = cursor a la celda donde esta el dato }
q := espacio [p].sig;
espacio [q].elemento := x;
if (espacio [q].sig = nyl) then post := q;
end; {INSERTA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function liscif.LOCALIZA (x: tipo_elemento): posicion;
var
p : posicion;
begin { Esta version es independiente de la implementacion}
p := PRIMERO ;
while (p <> FIN) do begin
if (RECUPERA (p) = x) then break ;
p := SIGUIENTE (p);
end ; {while}
LOCALIZA := p;
end; {LOCALIZA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function liscif.RECUPERA (p: posicion): tipo_elemento;
var
q : posicion;
begin
q := espacio [p].sig;
RECUPERA := espacio [q].elemento ;
end; {RECUPERA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure liscif.SUPRIME (var p: posicion);
begin
if not MUEVE (espacio [p].sig, disp) then begin
ERROR ('No puede liberar celda');
end ; {if}
if ( espacio [p].sig = nyl) then post := p;
end; {SUPRIME}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function liscif.SIGUIENTE (p: posicion): posicion;
begin
SIGUIENTE := espacio [p].sig;
end; {SIGUIENTE}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function liscif.ANTERIOR (p: posicion): posicion;
var
q : posicion;
begin {Esta version es independiente de la implementacion }
if (p = primero) then begin
ERROR ('No se puede dar la posicion anterior a primero');
end ; {if}
q := PRIMERO ;
while (q <> FIN) do begin
if ( SIGUIENTE (q) = p ) then break;
q := SIGUIENTE (q) ;
end ; {while}
ANTERIOR := p;
end; {ANTERIOR}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure liscif.ANULA ;
var
p : posicion;
begin
if (ant = nyl) then MUEVE (disp, ant);
p := espacio [ant].sig;
while (p <> nyl) do MUEVE (p, disp);
post := ant;
end; {ANULA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function liscif.PRIMERO : posicion;
begin
PRIMERO := ant;
end; {PRIMERO}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function liscif.FIN : posicion;
begin
fin := post;
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure liscif.IMPRIME (s : string) ;
var
q : posicion;
begin
if length (s) > 0 then writeln (s);
write ('imprime lista: ');
q := PRIMERO ;
while (q <> FIN) do begin
write ( RECUPERA (q),' ');
q := SIGUIENTE (q);
end; {while}
writeln ;
end; {IMPRIME}
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.