From: Alan Kennedy Date: Fri, 28 May 2004 01:10:08 +0000 (+0000) Subject: Progress en borrar X-Git-Tag: svn_import_r684~154 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/3f3702cf1367ecb4ab2d53182117078fbc42720a Progress en borrar --- diff --git a/emufs/b_plus_test.c b/emufs/b_plus_test.c index 3311353..7a0ea8c 100644 --- a/emufs/b_plus_test.c +++ b/emufs/b_plus_test.c @@ -7,6 +7,7 @@ int main(int argc, char* argv[]) { /* 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; @@ -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); +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; diff --git a/emufs/indice_bplus.c b/emufs/indice_bplus.c index 23a6f31..59b31ac 100644 --- a/emufs/indice_bplus.c +++ b/emufs/indice_bplus.c @@ -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--; + b_plus_destruir_nodo(nodo); 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) { - 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) { - 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) { - case 0: if (i < 0) return 0; + /* Busco predecesor en la hoja */ + case 0: if (i < 0) exitcode = 0; else { *prepostkey = nodo->claves[i]; - return 1; + exitcode = 1; } 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]; - return 1; + exitcode = 1; } 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; @@ -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); - 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... */ + 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; } - } - + } } return exitcode; diff --git a/emufs/indice_bplus.h b/emufs/indice_bplus.h index 8aa2380..81963fc 100644 --- a/emufs/indice_bplus.h +++ b/emufs/indice_bplus.h @@ -32,5 +32,6 @@ int emufs_b_plus_destuir(); int emufs_b_plus_eliminar(INDICE *idx, CLAVE key, int num_node); int b_plus_existe_clave(INDICE *idx, INDEX_DAT *query, int num_node); NODO_B_PLUS *b_plus_leer_nodo(INDICE *idx, int num); +int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostkey, int search_type); #endif