tpu/u_listcr.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

  Listas de reales por cursores y sin celdas de
  encabezamiento. keywords: lista, cursores

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: u_listcr.pas,v 1.1 2002/04/25 15:57:09 mstorti Exp mstorti $}

unit u_listcr ;

interface

const
  maxlen = 100 ; {longitud del arreglo de cursores}
  nyl    =   0 ; {equivalente del nil en punteros}
type
  tipo_elemento = real ;
  posicion = 0..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

  listcr = object
  private
    a : 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 listcr.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 listcr.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 listcr.INSERTA (x : tipo_elemento; 
			  p : posicion);
var
  q : posicion;
begin
  { hace q := cursor a la celda donde esta el dato }
  if (p = nyl) then
    q := a
  else begin
    q := espacio [p].sig;
  end ; {if}
  if MUEVE (disp, q) then begin
    espacio [q].elemento := x;
    if (p <> nyl) then
      espacio [p].sig := q
    else begin
      a := q;
    end ; {if}
  end; {if}
end; {INSERTA}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listcr.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 listcr.RECUPERA (p: posicion): tipo_elemento;
var
  q : posicion;
begin
  if (p <> nyl) then 
    begin
    q := espacio [p].sig;
    RECUPERA := espacio[q].elemento;
    end
  else begin
    RECUPERA := espacio [a].elemento ;
  end ; {if}
end; {RECUPERA}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listcr.SUPRIME (var p: posicion);
var
  b : boolean ;
  q : posicion ;
begin
  if ( p = nyl ) then {borra posicion n}
    b := MUEVE (a, disp)
  else begin
    q := espacio [p].sig ;
    b := MUEVE (q, disp) ;
    espacio [p].sig := q ;
  end ; {if}
end; {SUPRIME}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listcr.SIGUIENTE (p: posicion): posicion;
begin
  if (p <> nyl) then
    SIGUIENTE := espacio [p].sig
  else begin
    SIGUIENTE := a;
  end ; {if}
end; {SIGUIENTE}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listcr.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;
  end ; {while}
  ANTERIOR := p;
end; {ANTERIOR}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listcr.ANULA ;
begin
  a := nyl ;
end; {ANULA}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listcr.PRIMERO : posicion;
begin
  PRIMERO := 0;
end; {PRIMERO}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function listcr.FIN : posicion;
var
  p, q : posicion;
begin
  if (a = nyl) then { La lista esta vacia, retornal nyl }
    FIN := nyl
  else begin { FIN es la posicion de la ultima celda }
    p := a;
    while (true) do begin
      q := espacio [p].sig;
      if (q = nyl) then
        break
      else begin
        p := q;
      end ; {if}
    end ; {while}
    FIN := p;
  end ; {if}
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure listcr.IMPRIME (s : string) ;
var
  q : posicion;
begin
  if length (s) > 0 then writeln (s);
  writeln ('lista: ');

  q := PRIMERO ;
  while (q <> FIN) do begin
    writeln ( RECUPERA (q) );
    q := SIGUIENTE (q);
  end; {while}
  writeln ;
end; {IMPRIME}

end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.