Perdón, fallo mio, me referia al de "borrado".
Entiendo que es el proceso inverso (+ ó -) pero por más que me ayudo del de borrado en memoria y del de insertar tuyo no entiendo porque me falla, será alguna chorrada pero me esta volviendo tarumba y si eso era por comparar…
Publicados por jalbertoa
-
RE: Borrado árboles B
-
RE: Borrado árboles B
<small>@vallekano:</small><br><blockquote>Bueno, por si te quieres volver loco he encontrado el código que decía.<br /><br />Son las funciones echas en pascal que creé para insertar elementos en un Arbol B que usaba como índice en un programa. Este arbol está implementado en un archivo en vez de en memoria.<br /><br />Ala, te pego el mazacote, haz lo que quieras con el xDxD:<br /><br /><pre>
(PROCEDIMIENTO INSERTAR CLAVE EN UN INDICE**)Procedure Insertar(x:TNombre;Var F:ArbolIndice;PosDatos:Integer);
Type
Tabla=Record
Claves:Array[1..(2k+1)] of TNombre;
Descendientes:Array[0..(2k+1)] of Integer;
Posicion:Array[1..(2*k+1)] of Integer
End;Function Vacio(B:TArbolB):Boolean;
Begin
Vacio:=(B.NumClaves=0)
End;Function ObtenerPosicion(Var F:ArbolIndice):Integer;
Begin
ObtenerPosicion:=Filesize(F)
End;Procedure InicializarNodo(Var B:TArbolB);
Var
i:Integer;
Begin
B.NumClaves:=0;
For i:=0 to 2*k do
B.Descendiente[i]:=-1
End;Procedure OrdenarLista(Var L:Tabla);
Var
i,j,DescenAux,PosFinalAux:Integer;
ClaveAux:TNombre;
Begin
ClaveAux:=L.Claves[2k+1];
DescenAux:=L.Descendientes[2k+1];
PosFinalAux:=L.Posicion[2k+1];
i:=1;
While (i<=2k+1) and (L.Claves[i]<ClaveAux) do
i:=i+1;
For j:=2*k downto i do
Begin
L.Claves[j+1]:=L.Claves[j];
L.Descendientes[j+1]:=L.Descendientes[j];
L.Posicion[j+1]:=L.Posicion[j]
End;
L.Claves[i]:=ClaveAux;
L.Descendientes[i]:=DescenAux;
L.Posicion[i]:=PosFinalAux
End;Procedure InsertarAux(Var FI:ArbolIndice;Var x:TNombre;Var NumNodo:Integer;Var Posicion:Integer;
Var Terminado,Reestructurar:Boolean;Var PosFinal:Integer);
Var
i,j,PosAux:Integer;
Lista:Tabla;
Aux,B:TArbolB;Begin
seek(FI,NumNodo);
read(FI,B);
InicializarNodo(Aux);
While not Terminado do
Begin
i:=1;
If B.Descendiente[0]=-1 then (Es una hoja)
If Vacio(B) then (Hoja Vacia)
Begin
B.Clave[1]:=x;
B.Posicion[1]:=PosFinal;
B.NumClaves:=1;
Seek(FI,NumNodo);
Write(FI,B);
Terminado:=True
End
Else
If B.NumClaves<2k then (Hoja no Vacia pero con Sitio)
Begin
While (B.Clave[i]<=x) and (i<=B.NumClaves) do
i:=i+1;
If B.Clave[i-1]=x then
Write('Clave ya existente')
Else
Begin
For j:=B.NumClaves downto i do
Begin
B.Clave[j+1]:=B.Clave[j];
B.Descendiente[j+1]:=B.Descendiente[j];
B.Posicion[j+1]:=B.Posicion[j]
End;
B.Clave[i]:=x;
B.Posicion[i]:=PosFinal;
B.NumClaves:=B.NumClaves+1;
Seek(FI,NumNodo);
Write(FI,B)
End;
Terminado:=True
End
Else (Hoja Llena)
Begin
Lista.Claves[2k+1]:=x;
Lista.Posicion[2k+1]:=PosFinal;
Posicion:=ObtenerPosicion(FI);
Lista.Descendientes[2k+1]:=Posicion;
For i:=1 to (2k) do
Lista.Claves[i]:=B.Clave[i];
For i:=1 to (2k) do
Lista.Posicion[i]:=B.Posicion[i];
For i:=0 to 2k do
Lista.Descendientes[i]:=B.Descendiente[i];
OrdenarLista(Lista);
For i:=1 to k do
B.Clave[i]:=Lista.Claves[i];
For i:=1 to k do
B.Posicion[i]:=Lista.Posicion[i];
For i:=0 to k do
B.Descendiente[i]:=Lista.Descendientes[i];
For i:=k+2 to (2k+1) do
Aux.Clave[i-k-1]:=Lista.Claves[i];
For i:=k+2 to (2k+1) do
Aux.Posicion[i-k-1]:=Lista.Posicion[i];
For i:=k+1 to (2k+1) do
Aux.Descendiente[i-k-1]:=Lista.Descendientes[i-k-1];
x:=Lista.Claves[k+1];
PosFinal:=Lista.Posicion[k+1];
B.NumClaves:=k;
Aux.NumClaves:=k;
Seek(FI,NumNodo);
Write(FI,B);
Seek(FI,Posicion);
Write(FI,Aux);
Terminado:=True;
Reestructurar:=True
EndElse (*El nodo no es una hoja*) Begin While (B.Clave[i]<=x) and (i<=B.NumClaves) do i:=i+1; If B.Clave[i-1]=x then Write('Clave ya existente') Else Begin InsertarAux(FI,x,B.Descendiente[i-1],Posicion,Terminado,Reestructurar,PosFinal); If Reestructurar then (*Nodo Intermedio a reestructurar*) If B.NumClaves<2*k then Begin While (B.Clave[i]<=x) and (i<=B.NumClaves) do i:=i+1; If B.Clave[i-1]=x then Write('Clave ya existente') Else Begin For j:=B.NumClaves downto i do Begin B.Clave[j+1]:=B.Clave[j]; B.Posicion[j+1]:=B.Posicion[j]; B.Descendiente[j+1]:=B.Descendiente[j] End; B.Clave[i]:=x; B.Posicion[i]:=PosFinal; B.Descendiente[i]:=Posicion; B.NumClaves:=B.NumClaves+1; Seek(FI,NumNodo); Write(FI,B) End; Terminado:=True; Reestructurar:=False End Else (*Nodo intermedio a reestructurar sin sitio*) Begin Lista.Claves[2*k+1]:=x; Lista.Posicion[2*k+1]:=PosFinal; PosAux:=ObtenerPosicion(FI); Lista.Descendientes[2*k+1]:=Posicion; For i:=1 to (2*k) do Lista.Claves[i]:=B.Clave[i]; For i:=1 to (2*k) do Lista.Posicion[i]:=B.Posicion[i]; For i:=0 to 2*k do Lista.Descendientes[i]:=B.Descendiente[i]; OrdenarLista(Lista); For i:=1 to k do B.Clave[i]:=Lista.Claves[i]; For i:=1 to k do B.Posicion[i]:=Lista.Posicion[i]; For i:=0 to k do B.Descendiente[i]:=Lista.Descendientes[i]; For i:=k+2 to (2*k+1) do Aux.Clave[i-k-1]:=Lista.Claves[i]; For i:=k+2 to (2*k+1) do Aux.Posicion[i-k-1]:=Lista.Posicion[i]; For i:=k+1 to (2*k+1) do Aux.Descendiente[i-k-1]:=Lista.Descendientes[i]; x:=Lista.Claves[k+1]; PosFinal:=Lista.Posicion[k+1]; B.NumClaves:=k; Aux.NumClaves:=k; Seek(FI,NumNodo); Write(FI,B); Seek(FI,PosAux); Write(FI,Aux); Posicion:=PosAux; Terminado:=True; Reestructurar:=True End End End End
End;
Var
Raiz,aux:TArbolB;
Posicion,Pos,i:Integer;
Terminado,Reestructurar:Boolean;Begin
seek(F,0);
read(F,Raiz);
Terminado:=False;
Reestructurar:=False;
InsertarAux(F,x,Raiz.Descendiente[0],Posicion,Terminado,Reestructurar,PosDatos);
If Reestructurar then
Begin
InicializarNodo(aux);
aux.Clave[1]:=x;
aux.Posicion[1]:=PosDatos;
aux.Descendiente[0]:=Raiz.Descendiente[0];
aux.Descendiente[1]:=Posicion;
aux.NumClaves:=1;
Pos:=ObtenerPosicion(F);
Seek(F,Pos);
Write(F,Aux);
Raiz.Descendiente[0]:=Pos;
Seek(F,0);
Write(F,Raiz)
End
End;
(****FIN INSERTAR CLAVE EN INDICE)No tendrias tambien el de Insertar?
Yo trato de modificar el de memoria principal a fichero y no hay manera...[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]</pre></blockquote>