]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Progress en borrar
authorAlan Kennedy <kennedya@3dgames.com.ar>
Fri, 28 May 2004 01:10:08 +0000 (01:10 +0000)
committerAlan Kennedy <kennedya@3dgames.com.ar>
Fri, 28 May 2004 01:10:08 +0000 (01:10 +0000)
emufs/b_plus_test.c
emufs/indice_bplus.c
emufs/indice_bplus.h

index 3311353729183a3f085c7a660f59cec27665acee..7a0ea8cdfda21e60f22c0dd583b122915a64bf3e 100644 (file)
@@ -7,6 +7,7 @@ int main(int argc, char* argv[]) {
 
 /* Locals */
 INDEX_DAT querydata;
 
 /* Locals */
 INDEX_DAT querydata;
+CLAVE postkey, prekey;
 int i = 0;
 int exitcode = 0;
 int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
 int i = 0;
 int exitcode = 0;
 int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
@@ -46,6 +47,11 @@ printf("Exit Code del Buscar Clave: %i\n",exitcode);
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,1);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);
 
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,1);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);
 
+querydata.clave.i_clave = 8;
+exitcode = b_plus_buscar_prepost(emu->indices,querydata.clave,0,&postkey,1);
+printf("El Sucesor de la clave %i es %i\n",querydata.clave.i_clave,postkey.i_clave);
+/*exitcode = b_plus_buscar_prepost(emu->indices,querydata.clave,0,&prekey,0);
+printf("El Predecesor de la clave %i es %i\n",querydata.clave.i_clave,prekey.i_clave);*/
 /*
 querydata.num_bloque = 2;
 querydata.clave.i_clave = 7;
 /*
 querydata.num_bloque = 2;
 querydata.clave.i_clave = 7;
index 23a6f31379919b8895a2164e0c89dc93f291ef6a..59b31ac0831282e621638275a210f75cd253e18f 100644 (file)
@@ -305,6 +305,7 @@ int b_plus_existe_clave(INDICE *idx, INDEX_DAT *query, int num_node)
        if (nodo->nivel == 0) {
         /* Vemos en que bloque deberia ir */
                while ( i >= 0 && query->clave.i_clave != nodo->claves[i].i_clave ) i--;
        if (nodo->nivel == 0) {
         /* Vemos en que bloque deberia ir */
                while ( i >= 0 && query->clave.i_clave != nodo->claves[i].i_clave ) i--;
+               b_plus_destruir_nodo(nodo);
                if (i < 0) return 0; /* No encontre la clave */
                else return 1; /* Encontre la clave */                  
        }
                if (i < 0) return 0; /* No encontre la clave */
                else return 1; /* Encontre la clave */                  
        }
@@ -330,37 +331,36 @@ int b_plus_cant_claves_nodo(INDICE *idx, int num_node)
    Exitcode: 1 - Encontre lo buscado, 0 - No lo encontre */
 int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostkey, int search_type)
 {
    Exitcode: 1 - Encontre lo buscado, 0 - No lo encontre */
 int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostkey, int search_type)
 {
-       int i = 0, j = 0;
+       int i = 0, exitcode = 0;
        NODO_B_PLUS *nodo = b_plus_leer_nodo(idx,num_node);             
        if (nodo == NULL) return -1;
        i = nodo->cant_claves - 1;
        
        if (nodo->nivel == 0) {
        NODO_B_PLUS *nodo = b_plus_leer_nodo(idx,num_node);             
        if (nodo == NULL) return -1;
        i = nodo->cant_claves - 1;
        
        if (nodo->nivel == 0) {
-               while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;
-               /* Busco predecesor en la hoja */       
+               PERR ("Entre en hoja");
+               while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;          
                switch (search_type) {
                        
                switch (search_type) {
                        
-                       case 0: if (i < 0) return 0;
+                       /* Busco predecesor en la hoja */                       
+                       case 0: if (i < 0) exitcode = 0;
                                        else {
                                                *prepostkey = nodo->claves[i];
                                        else {
                                                *prepostkey = nodo->claves[i];
-                                               return 1;
+                                               exitcode = 1;
                                        }
                                        break;
                                        }
                                        break;
-                                       
-                       case 1: if (nodo->claves[i].i_clave == key.i_clave) return 0;
+
+                       /* Busco sucesor en la hoja */                                                          
+                       case 1: if ((nodo->claves[i].i_clave == key.i_clave) && (i == nodo->cant_claves-1)) exitcode = 0;
                                        else {
                                                *prepostkey = nodo->claves[i+1];
                                        else {
                                                *prepostkey = nodo->claves[i+1];
-                                               return 1;
+                                               exitcode = 1;
                                        }
                                        break;
                                        }
                                        break;
-               }
-                                                                                                       
-               /* Busco sucesor en la hoja */  
-               if ((search_type == 1) && (i < 0)) return 0;
-               else if (i >= 0) {
-                               *prepostkey = nodo->claves[i];
-                               return 1;
-               }                               
+               }                                                                                                               
+               /* Libero y devuelvo exitcode */
+               b_plus_destruir_nodo(nodo);
+               return(exitcode);               
+               
        } else {
                /* Veo por que rama debo seguir buscando el pre o post */
                while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;          
        } else {
                /* Veo por que rama debo seguir buscando el pre o post */
                while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;          
@@ -369,17 +369,22 @@ int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostke
                        else {
                                /* Busco primero por la rama derecha, sino por la izquierda */
                                exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+2],prepostkey,search_type);
                        else {
                                /* Busco primero por la rama derecha, sino por la izquierda */
                                exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+2],prepostkey,search_type);
-                               if (exitcode == 0) exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);                                                           
+                               if (exitcode == 0) 
+                               {
+                                       PERR("Volvi de rama derecha");
+                                       exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);                                                              
+                               }
                        }
                } else  {
                        /* Busco un sucesor, y funciona como getbloque... */
                        }
                } else  {
                        /* Busco un sucesor, y funciona como getbloque... */
+                       PERR("Busco sucesor..., llamo recursivo..");
+                       printf("Voy a buscar en hijo nro: %i\n",nodo->hijos[i+1]);
                        exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);
                        if (exitcode == 0) {
                                *prepostkey = nodo->claves[i+1];
                                exitcode = 1;
                        }
                        exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);
                        if (exitcode == 0) {
                                *prepostkey = nodo->claves[i+1];
                                exitcode = 1;
                        }
-               }
-                       
+               }               
        }
        
        return exitcode;
        }
        
        return exitcode;
index 8aa23802205e7fc89721229d36c60ce0afea0064..81963fcbf47c9c57d75fc7bcd26c919fc68a933a 100644 (file)
@@ -32,5 +32,6 @@ int emufs_b_plus_destuir();
 int emufs_b_plus_eliminar(INDICE *idx, CLAVE key, int num_node);\r
 int b_plus_existe_clave(INDICE *idx, INDEX_DAT *query, int num_node);\r
 NODO_B_PLUS *b_plus_leer_nodo(INDICE *idx, int num);\r
 int emufs_b_plus_eliminar(INDICE *idx, CLAVE key, int num_node);\r
 int b_plus_existe_clave(INDICE *idx, INDEX_DAT *query, int num_node);\r
 NODO_B_PLUS *b_plus_leer_nodo(INDICE *idx, int num);\r
+int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostkey, int search_type);\r
 \r
 #endif
 \r
 #endif