tpu/u_listai.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Listas de enteros por arreglos. keywords: lista, arreglos
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: u_listai.pas,v 1.1 2002/04/25 15:57:09 mstorti Exp mstorti $}
unit u_listai;
interface
const
maxlen = 10 ; {longitud del arreglo}
nyl = 0 ; {equivalente del nil en punteros}
type
tipo_elemento = integer;
posicion = 0..maxlen; {posicion en rango admisible}
t_ultimo = 0..maxlen; {ultimo en rango admisible}
t_lista = record
elemento : array [1..maxlen] of tipo_elemento;
ult : t_ultimo
end;
listai = object
private
L : t_lista ;
procedure ERROR (s: string);
public
procedure INSERTA (x: tipo_elemento; p: posicion);
function LOCALIZA (x: tipo_elemento): posicion;
function RECUPERA (p: posicion): tipo_elemento;
procedure SUPRIME (p: posicion);
function SIGUIENTE (p: posicion): posicion;
function ANTERIOR (p: posicion): posicion;
procedure ANULA ;
function PRIMERO : posicion;
function FIN : posicion;
procedure IMPRIME (s : string) ;
end;
implementation
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listai.ERROR (s: string);
begin
write ('error: ');
writeln (s);
halt;
end; {ERROR}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listai.INSERTA ( x: tipo_elemento;
p: posicion);
var
q, i : posicion;
begin
if ( L.ult >= maxlen ) then
ERROR ('la lista esta llena')
else if ( p > L.ult + 1) or ( p < 1) then
ERROR ('la posicion no existe')
else begin {desplaza los p, p+1, ... un lugar h/abajo}
for q := L.ult downto p do begin
L.elemento [q+1] := L.elemento [q];
end ; {for}
L.ult := L.ult + 1 ;
L.elemento [p] := x ;
end ; {if}
end; {INSERTA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listai.LOCALIZA (x: tipo_elemento): posicion;
var
q, r : posicion;
siga : boolean ;
begin
r := L.ult + 1 ;
q := 1 ;
siga := true ;
while ( q <= L.ult ) and (siga) do begin
if ( L.elemento [q] = x ) then begin
r := q ;
siga := false ;
end ; {if}
q := q + 1 ;
end ; {while}
LOCALIZA := r ;
writeln ;
writeln ('localiza elemento ; x = ', x);
writeln ('en posicion ; r = ', r);
end; {LOCALIZA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listai.RECUPERA (p: posicion): tipo_elemento;
begin
RECUPERA := L.elemento [p];
end; {RECUPERA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listai.SUPRIME (p: posicion);
var
q : posicion ;
begin
if ( p > L.ult ) or ( p < 1) then
ERROR ('la posicion no existe')
else begin {desplaza los p+1, p+2, ..., un lugar h/arriba}
L.ult := L.ult - 1 ;
for q := p to (L.ult) do begin
L.elemento [q] := L.elemento [q + 1];
end ; {for}
end ; {if}
end; {SUPRIME}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listai.SIGUIENTE (p: posicion): posicion;
begin
SIGUIENTE := p + 1 ;
end; {SIGUIENTE}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listai.ANTERIOR (p: posicion): posicion;
begin
if ( p > L.ult ) or ( p < 1) then
ERROR ('la posicion no existe')
else begin
ANTERIOR := p - 1 ;
end ; {if}
end; {ANTERIOR}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listai.ANULA ;
begin
L.ult := 0 ;
end; {ANULA}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listai.PRIMERO : posicion;
begin
PRIMERO := 1 ;
end; {PRIMERO}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listai.FIN : posicion;
begin
FIN := L.ult + 1 ;
end; {FIN}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listai.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.