}
/* Search_Type: 0 - Predecesor, 1 - Sucesor
- Exitcode: 1 - Encontre lo buscado, 0 - No lo encontre */
+ Exitcode: 1 - Encontre lo buscado, 0 - No lo encontre, -1 Error */
int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostkey, int search_type)
{
int i = 0, exitcode = 0;
i = nodo->cant_claves - 1;
if (nodo->nivel == 0) {
- PERR ("Entre en hoja");
+ printf ("Entre en hoja nro %i\n",num_node);
while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;
switch (search_type) {
/* Busco predecesor en la hoja */
- case 0: if (i < 0) exitcode = 0;
- else {
- *prepostkey = nodo->claves[i];
+ case 0: if (i <= 0) exitcode = 0;
+ else {
+ if (nodo->claves[i].i_clave == key.i_clave) *prepostkey = nodo->claves[i-1];
+ else *prepostkey = nodo->claves[i];
exitcode = 1;
}
break;
exitcode = 1;
}
break;
- }
- /* 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;
if (i < 0) exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],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)
- {
- PERR("Volvi de rama derecha");
- exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);
- }
+ exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);
+ if (exitcode == 0)
+ exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i],prepostkey,search_type);
}
+ /* Handleo busqueda de clave menor o igual que todas */
+ if (exitcode == 0) exitcode = -1;
} 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;
- }
+ /* Veo si tengo que devolver la clave izquierda del padre del que acabo de buscar */
+ if (exitcode == 0)
+ if (i < nodo->cant_claves-1) {
+ *prepostkey = nodo->claves[i+1];
+ exitcode = 1;
+ } else exitcode = -1;
}
}
- return exitcode;
+ /* Libero y devuelvo exitcode */
+ b_plus_destruir_nodo(nodo);
+ return(exitcode);
}
int emufs_b_plus_eliminar(INDICE *idx, CLAVE key, int num_node)