-- AUTOR: Elvira Mayordomo Cámara
-- PROYECTO: módulo de implementación del
-- TAD aeropuertos solución del ejercicio 9 de
-- tablas hash
-- FICHERO: aeropuertos.adb
-- FECHA: 7-1-04
with ustrings, Ada.Strings.Unbounded, unchecked_deallocation;
use ustrings, Ada.Strings.Unbounded;
package body aeropuertos is
procedure disponer is new unchecked_deallocation(rvuelo,ptvuelo);
function h(nom:ustring;m:integer) return integer is
--hash por método de la división con módulo m
res:integer;
begin
res:=0;
for i in 1..length(nom) loop
res:=res+character'pos(Element(nom,i));
end loop;
return res mod m;
end h;
procedure crear(l:in listadestinos;a:out aeropuerto) is
--Post: a:=crea(l)
begin
tablavacia(a.losdest);
tablavacia(a.losvuelos);
a.nabiertas:=0;
end crear;
procedure abrir(a:in out aeropuerto;l:in listadestinos) is
--Pre: a.nabiertas<P and a=a0
--Post: a:=abre(a0,l)
l2:listadestinos;
aux:ptpista;
begin
a.nabiertas:=a.nabiertas+1;
a.laspistas(a.nabiertas):=(0,null,null);
l2:=l;
while l2/=null loop
if esta(a.losdest,l2.nombre) then
aux:=consultar(a.losdest,l2.nombre);
aux:=new rpista'(a.nabiertas,aux);
else
aux:=new rpista'(a.nabiertas,null);
end if;
modificar(a.losdest,l2.nombre,aux);
l2:=l2.sig;
end loop;
end abrir;
procedure asignarPista(a:in out aeropuerto;v:in ustring;d:in ustring) is
--Pre: v no existe en a and d está en a.losdest and a=a0
--Post: a:=asignaPista(a0,v,d)
masvacia:integer;
p:ptpista;
begin
p:=consultar(a.losdest,d);
masvacia:=p.valor;
while p/=null loop
if
a.laspistas(p.valor).numvuelos<a.laspistas(masvacia).numvuelos then
masvacia:=p.valor;
end if;
p:=p.sig;
end loop;
a.laspistas(masvacia).numvuelos:=a.laspistas(masvacia).numvuelos+1;
if a.laspistas(masvacia).numvuelos=1 then
a.laspistas(masvacia).primcola:=new
rvuelo'(v,masvacia,1,null);
a.laspistas(masvacia).ultcola:=a.laspistas(masvacia).primcola;
else
a.laspistas(masvacia).ultcola.sig:=new
rvuelo'(v,masvacia,a.laspistas(masvacia).numvuelos,null);
a.laspistas(masvacia).ultcola:=a.laspistas(masvacia).ultcola.sig;
end if;
modificar(a.losvuelos,v,a.laspistas(masvacia).ultcola);
end asignarPista;
procedure despegar(a:in out aeropuerto;n:in integer) is
--Pre: n<=a.nabiertas and a.laspistas(n).numvuelos<>0 and a=a0
--Post: a:=despega(a0,n)
p:ptvuelo;
begin
p:=a.laspistas(n).primcola;
a.laspistas(n).primcola:=a.laspistas(n).primcola.sig;
a.laspistas(n).numvuelos:=a.laspistas(n).numvuelos-1;
if a.laspistas(n).numvuelos=0 then a.laspistas(n).ultcola:=null; end if;
borrar(a.losvuelos,p.nombre);
disponer(p);
end despegar;
function cuantosDelante(a:aeropuerto;v:ustring) return integer is
--Pre: v existe en a
--Post: devuelve cuántosDelante(a,v)
j,p:integer;
begin
j:=consultar(a.losvuelos,v).posicion;
p:=consultar(a.losvuelos,v).pista;
return(j-a.laspistas(p).primcola.posicion);
end cuantosDelante;
end aeropuertos;
syntax highlighted by Code2HTML, v. 0.9.1