with ada.strings.unbounded, ustrings, unchecked_deallocation;
use ada.strings.unbounded, ustrings;
package body dicc is
procedure disponer is new unchecked_deallocation(unDato,ptDato);
procedure vacio(d:out diccionario) is
begin
d.numpal:=0;
d.datos:=null;
end vacio;
procedure busca_rec(p:in ptDato; palabra:in ustring; definicion:out ustring) is
-- es la busqueda en el arbol (la pongo aqui porque se usa tambien en "="
begin
if palabra=p.clave then --palabra encontrada
definicion:=p.info;
elsif palabra
p.clave then --borrar en el subarbol derecho
borra_rec(p.der,palabra,flag);
else --borra la raiz
if p.izq=null then --no tiene hijo izq, luego es facil borrar
aux:=p;
p:=p.der;
disponer(aux);
flag:=true;
else --hay que sustituirlo por el maximo del subarbol izquierdo
max(p.izq,p.clave,p.info);
borra_rec(p.izq,p.clave,flag);
end if;
end if;
else
flag:=false;
end if;
end borra_rec;
begin
borra_rec(d.datos,palabra,flag);
if flag then d.numpal:=d.numpal-1; end if;
end borra;
procedure asignar(dout:out diccionario; din:in diccionario) is
procedure asignar_rec(pout:out ptDato; pin:in ptDato) is
ai,ad:ptDato;
begin
if pin=null then --es vacio
pout:=null;
else --arbol no vacio
asignar_rec(ai,pin.izq);
asignar_rec(ad,pin.der);
pout:=new unDato;
pout.clave:=pin.clave;
pout.info:=pin.info;
pout.izq:=ai;
pout.der:=ad;
end if;
end asignar_rec;
begin
dout.numpal:=din.numpal;
asignar_rec(dout.datos,din.datos);
end asignar;
function "="(d1,d2:in diccionario) return boolean is
function eq_rec(p1,p2: ptDato) return boolean is
def:ustring; aux:boolean;
begin
if p1=null then
return true;
else
busca_rec(p2,p1.clave,def);
if def/=p1.info then
return false;
else
aux:=eq_rec(p1.izq,p2);
if not aux then
return false;
else
aux:=eq_rec(p1.der,p2);
return aux;
end if;
end if;
end if;
end eq_rec;
begin
if d1.numpal/=d2.numpal then
return false;
else
return eq_rec(d1.datos,d2.datos);
end if;
end "=";
procedure liberar(d:in out diccionario) is
procedure liberar_rec(p:in out ptDato) is
begin
if p/=null then --hay algo que liberar
liberar_rec(p.izq);
liberar_rec(p.der);
disponer(p);
p:=null;
end if;
end liberar_rec;
begin
liberar_rec(d.datos);
d.numpal:=0;
end liberar;
procedure listado(d:in diccionario) is
procedure listado_rec(p:in ptDato) is
begin
if p/=null then --hay algo que listar
listado_rec(p.izq);
put_line(p.clave);
put_line(p.info);
listado_rec(p.der);
end if;
end listado_rec;
begin
listado_rec(d.datos);
end listado;
end dicc;