• Portada
    • Recientes
    • Usuarios
    • Registrarse
    • Conectarse
    1. Foro
    2. jalbertoa
    J
    • Perfil
    • Siguiendo 0
    • Seguidores 0
    • Temas 0
    • Mensajes 2
    • Mejor valorados 0
    • Controversial 0
    • Grupos 0

    jalbertoa

    @jalbertoa

    10
    Reputación
    64
    Visitas
    2
    Mensajes
    0
    Seguidores
    0
    Siguiendo
    Registrado Última vez conectado
    Edad 40

    jalbertoa Dejar de seguir Seguir

    Latest posts made by jalbertoa

    • RE: Borrado árboles B

      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…

      publicado en Software
      J
      jalbertoa
    • 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..(2
      k+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[2
      k+1];
      PosFinalAux:=L.Posicion[2k+1];
      i:=1;
      While (i<=2
      k+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[2
      k+1]:=x;
      Lista.Posicion[2k+1]:=PosFinal;
      Posicion:=ObtenerPosicion(FI);
      Lista.Descendientes[2
      k+1]:=Posicion;
      For i:=1 to (2k) do
      Lista.Claves[i]:=B.Clave[i];
      For i:=1 to (2
      k) 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 (2
      k+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 (2
      k+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
      End

          Else                  (*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>

      publicado en Software
      J
      jalbertoa