From: Alan Kennedy Date: Sun, 30 May 2004 06:01:52 +0000 (+0000) Subject: Agrego funciones para obtener menor y mayor claves del arbol y las asigno a punteros... X-Git-Tag: svn_import_r684~88 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/439bc9dba0fb23fa34afeebb80e1288d9f8d39f4?ds=sidebyside Agrego funciones para obtener menor y mayor claves del arbol y las asigno a punteros en INDICE, comenzando a darle algo a richard. Continuo laburando en el obtener_sig_clave que es fundamental para rich --- diff --git a/emufs/b_plus_test.c b/emufs/b_plus_test.c index c3452ca..d38f91f 100644 --- a/emufs/b_plus_test.c +++ b/emufs/b_plus_test.c @@ -48,10 +48,16 @@ querydata.clave.i_clave = i; emufs_b_plus_insertar(emu->indices,&querydata); } -querydata.clave.i_clave = 1024; +querydata.clave.i_clave = 64; exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0); printf("Exit Code del Borrar Clave: %i\n",exitcode); +querydata.clave = emufs_b_plus_obtener_menor_clave(emu->indices); +printf("La menor clave del arbol es: %i\n",querydata.clave.i_clave); + +querydata.clave = emufs_b_plus_obtener_mayor_clave(emu->indices); +printf("La mayor clave del arbol es: %i\n",querydata.clave.i_clave); + /* NOTA: Deberia devolver el mismo 104 y Exitcode = -1 */ /*querydata.num_bloque = 104; querydata.clave.i_clave = 0; @@ -101,7 +107,7 @@ querydata.clave.i_clave = 1; exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0); printf("Exit Code del Borrar Clave: %i\n",exitcode);*/ -ver_arbol(emu); +/*ver_arbol(emu);*/ return 0; diff --git a/emufs/indice_bplus.c b/emufs/indice_bplus.c index 36f9757..1cf8b01 100644 --- a/emufs/indice_bplus.c +++ b/emufs/indice_bplus.c @@ -681,3 +681,61 @@ int b_plus_get_num_nodo(INDICE *idx) fclose(fp); return num; } + +CLAVE emufs_b_plus_obtener_menor_clave(INDICE *idx) { + + CLAVE key; + NODO_B_PLUS *node; + int num_child = 0; + node = b_plus_leer_nodo(idx,0); + if (node == NULL) { + key.i_clave = -1; + return key; + } + + while (node->nivel > 0) { + /* Deciendo por la rama de mas hacia la izquierda */ + if (node->cant_claves > 0) { + num_child = node->hijos[0]; + b_plus_destruir_nodo(node); + node = b_plus_leer_nodo(idx,num_child); + } + else break; + } + + /* Ahora estoy en la primer hoja del arbol, devuelvo la primer clave */ + key = node->claves[0]; + b_plus_destruir_nodo(node); + + return key; +} + +CLAVE emufs_b_plus_obtener_mayor_clave(INDICE *idx) { + + CLAVE key; + NODO_B_PLUS *node; + int num_child = 0, cant_claves = 0; + node = b_plus_leer_nodo(idx,0); + if (node == NULL) { + key.i_clave = -1; + return key; + } + + cant_claves = node->cant_claves; + while (node->nivel > 0) { + /* Deciendo por la rama de mas hacia la derecha */ + if (node->cant_claves > 0) { + num_child = node->hijos[cant_claves]; + b_plus_destruir_nodo(node); + node = b_plus_leer_nodo(idx,num_child); + cant_claves = node->cant_claves; + } + else return key; + } + + /* Ahora estoy en la primer hoja del arbol, devuelvo la ultima clave */ + key = node->claves[cant_claves-1]; + b_plus_destruir_nodo(node); + + return key; +} diff --git a/emufs/indice_bplus.h b/emufs/indice_bplus.h index 2f53529..49e10ef 100644 --- a/emufs/indice_bplus.h +++ b/emufs/indice_bplus.h @@ -31,5 +31,7 @@ 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, INDEX_DAT *prepostkey, int search_type); int emufs_b_plus_reemplazar_clave(INDICE *idx, CLAVE key, INDEX_DAT query, int num_node); +CLAVE emufs_b_plus_obtener_menor_clave(INDICE *idx); +CLAVE emufs_b_plus_obtener_mayor_clave(INDICE *idx); int b_plus_destruir_nodo(NODO_B_PLUS *nodo); #endif diff --git a/emufs/indices.c b/emufs/indices.c index fdb6c4b..dfd0e31 100644 --- a/emufs/indices.c +++ b/emufs/indices.c @@ -86,6 +86,8 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND tmp->size_claves = (tmp->tam_bloque - SIZE_B_PLUS_HEADER - sizeof(CLAVE))/2; tmp->size_hijos = tmp->size_claves + sizeof(CLAVE); emufs_b_plus_crear(tmp); + tmp->obtener_menor_clave = emufs_b_plus_obtener_menor_clave; + tmp->obtener_mayor_clave = emufs_b_plus_obtener_mayor_clave; PERR("AÚN NO IMPLEMENTADO DEL TODO!!!!!!!!"); break; } @@ -303,4 +305,3 @@ int emufs_indice_es_clave_nula(INDICE *idx, CLAVE k) } return 0; } -