-- 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