tpu/u_shashi.pas

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

 TDA-Diccionario (Inserta, Suprime, Miembro, Anula)
 con dispersi\'on abierta, para enteros.
 keywords: conjunto, tabla de dispersion

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: u_shashi.pas 2003/06/12 13:57 mstorti Exp jdelia   $ }
unit u_shashi;
interface
uses u_listpi;
const
  B = 30; {numero de cubetas}
type
  tipo_elemento = integer;
  sethashi = object
  private
    A : array [1..B] of listpi;
    function H_FUN (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);
  end;

implementation

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function sethashi.H_FUN (x : tipo_elemento) : integer;
begin
  H_FUN := x mod B + 1
  { La siguiente funcion de dispersion puede servir     }
  { para reales entre 0 y 1, en donde "N" debe ser mayor}
  { que B, por ejemplo, 1000 }
  { H_FUN := trunc ( (x*N) * (x*N) div N);}
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethashi.ANULA;
var
  j : integer;
begin  {Anula las listas de todas las cubetas}
  for j := 1 to B do A [j].ANULA
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethashi.INSERTA (x : tipo_elemento);
var
  cubeta : integer;
  L      : listpi;
  p      : posicion;
begin
  cubeta := (H_FUN (x) mod B) + 1;
 {writeln ('poniendo ',x,' en la cubeta ',cubeta);}
  L := A [cubeta] ;
  p := L.FIN ;
  if ( L.LOCALIZA (x) = p) then L.INSERTA (x, p)
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function sethashi.MIEMBRO (x: tipo_elemento): boolean;
var
  cubeta : integer;
  L      : listpi ;
begin
 {ubica la cubeta}
  cubeta := ( H_FUN (x) mod B ) + 1 ;
 {busca en la lista correspondiente}
  L := A [cubeta];
  MIEMBRO := ( L.LOCALIZA (x) <> L.FIN )
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure sethashi.SUPRIME (x: tipo_elemento);
var
  cubeta : integer;
  p : posicion;
  L : listpi;
begin
 {ubica la cubeta}
  cubeta := ( H_FUN (x) mod B ) + 1 ;
 {busca en la lista correspondiente}
  L := A [cubeta] ;
  p := L.LOCALIZA (x);
  if (p <> L.FIN) then L.SUPRIME (p)
end ;

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

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

Generated by GNU enscript 1.6.1.