tpu/u_shasci.pas

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

 Conjunto de enteros con dispersi\'on cerrada, con
 resoluci\'on lineal de colisiones.
 keywords: conjunto, tabla de dispersion

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

unit u_shasci;

interface

const
 B          =  8;
 vacio      = -1;
 suprimido  = -2;

type
 tipo_elemento = integer;

 sethasci = object
 private
   A : array [0..B-1] of tipo_elemento;
   procedure ERROR (s : string);
   function H_FUN  (x: tipo_elemento) : integer;
   function REDISP (h,i : integer): integer;
   function LOCALIZA  (x : tipo_elemento): integer;
   function LOCALIZA1 (x : tipo_elemento): integer;
 public
   procedure ANULA;
   procedure INSERTA (x: tipo_elemento);
   function  MIEMBRO (x: tipo_elemento): boolean;
   procedure SUPRIME (x: tipo_elemento);
   procedure IMPRIME (s: string);
   procedure IMPRIME_TODO (s :string);
 end;

 implementation

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethasci.ERROR (s: string);
begin
  write ('error: '); 
  writeln (s);
  halt;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function sethasci.H_FUN (x: tipo_elemento): integer;
begin
  H_FUN := x mod B;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function sethasci.REDISP (h, i : integer): integer;
begin
  REDISP := (h + i) mod B;  {estrategia de redispersion lineal}
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethasci.ANULA;
var
  j : integer;
begin
  for j:= 0 to (B - 1) do A [j] := vacio;
end; { ANULA }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function sethasci.LOCALIZA (x: tipo_elemento): integer;
var
  inicial, i, j: integer;
begin
  inicial := H_FUN (x);
  i := 0;
  j := REDISP (inicial, i);
  while (i < B) and (A[j] <> x) and (A[j] <> vacio) do begin
    i := i + 1;
    j := REDISP (inicial, i);
  end ; {while}
  LOCALIZA := j;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function sethasci.LOCALIZA1 (x: tipo_elemento): integer;
var
  inicial, i, j: integer;
begin
  inicial := H_FUN (x);
  i := 0;
  j := REDISP (inicial, i);
  while (i < B)
    and (A [j] <> x)
    and (A [j] <> vacio)
    and (A [j] <> suprimido) do begin
       i := i + 1;
       j := REDISP (inicial, i);
  end ; {while}
  LOCALIZA1 := j;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethasci.INSERTA (x: tipo_elemento);
var
  cubeta : integer;
begin
  if ( A [LOCALIZA (x)] = x) then exit;
  cubeta := LOCALIZA1 (x);
  if (A [cubeta] = vacio) or (A[cubeta] = suprimido) then
     A [cubeta] := x
  else begin
     ERROR ('INSERTA falla por tabla llena')
  end ; {if}
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function sethasci.MIEMBRO (x: tipo_elemento): boolean;
begin
  MIEMBRO := ( A [ LOCALIZA (x) ] = x );
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethasci.SUPRIME (x: tipo_elemento);
var
  cubeta : integer;
begin
  cubeta := LOCALIZA (x);
  if (A [cubeta] = x) then A [cubeta] := suprimido ;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethasci.IMPRIME (s: string);
var
  j : integer;
begin
  if length (s) > 0 then writeln (s);
  for j := 0 to (B - 1) do begin
    if ( A [j] <> vacio ) then write(A[j],' ');
  end ; {for}
  writeln;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethasci.IMPRIME_TODO(s :string);
var
  j : integer;
begin
  if length (s) > 0 then writeln (s);
  for j := 0 to (B - 1) do begin
    write (j,' ',A [j],'   ');
  end ; {while}
  writeln;
end;

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

Generated by GNU enscript 1.6.1.