-- AUTOR: Elvira Mayordomo Cámara
-- PROYECTO: módulo de implementación del
-- TAD tablas hash por recolocación
-- cuadrática
-- FICHERO: tablasrecolocacion.adb
-- FECHA: 14-12-02
package body tablasrecolocacion is
function localizar(t:tabla;c:tpClave) return integer is
-- recordad que 2n<= max y max primo. Si no no
-- se puede garantizar el funcionamiento
-- correcto de localizar
-- Está función devuelve la posición de c en la tabla t.
-- Si c no está, devuelve la posición donde se colocaría c por
-- recolocación cuadrática.
-- Reaprovecha las posiciones borradas.
-- coste en tiempo O(1) en media
inicial,pos,i,libre:integer;
hayborradas:boolean;
begin
inicial:=h(c,max);
pos:=inicial;
hayborradas:=false;
i:=0;
-- El coste de todas las operaciones depende de este while
while (((not t(pos).vacio) and t(pos).laclave/=c)
or t(pos).borrado) loop
if t(pos).borrado then
hayborradas:=true;
libre:=pos;
end if;
i:= i+1;
pos:=(inicial + i*i) mod max;
end loop;
-- Si no ha encontrado c, aprovecha las posiciones borradas
if (t(pos).laclave/=c or t(pos).vacio) and hayborradas then
pos:=libre;
end if;
return pos;
end localizar;
procedure tablavacia(t:out tabla) is
-- Post: t=crearVacía
-- coste en tiempo O(max)
begin
for i in 0..max-1 loop
t(i).vacio:=true;
t(i).borrado:=false;
end loop;
end tablavacia;
function esta(t:tabla; c:tpClave) return boolean is
-- Post: esta(t,c)=está(t,c)
-- coste en tiempo O(1) en media
pos: integer;
begin
pos:=localizar(t,c);
return (t(pos).laclave=c and (NOT t(pos).vacio));
end esta;
procedure modificar(t:in out tabla; c:in tpClave; v: in tpValor) is
-- Pre: t=t0
-- Post: t=añadir(t0,c,v)
-- coste en tiempo O(1) en media
pos: integer;
begin
pos:=localizar(t,c);
if t(pos).vacio then
-- añado un dato nuevo
t(pos):=(c,v,false,false);
-- si ya estaba c modifico v
elsif t(pos).laclave=c then
t(pos).elvalor:=v;
end if;
end modificar;
function consultar(t:tabla; c:tpClave) return tpValor is
-- Pre: está(t,c)
-- Post: consulta(t,c)=elValor(t,c)
-- coste en tiempo O(1) en media
pos: integer;
begin
pos:=localizar(t,c);
return t(pos).elvalor;
end consultar;
procedure borrar(t:in out tabla; c:in tpClave) is
-- Pre: t=t0
-- Post: t=borrar(t0,c,v)
-- coste en tiempo O(1) en media
pos: integer;
begin
if esta(t,c) then
pos:=localizar(t,c);
t(pos).borrado:=true;
t(pos).vacio:=true;
end if;
end borrar;
end tablasrecolocacion;
syntax highlighted by Code2HTML, v. 0.9.1