]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Listo Caso 3a Rotacion Derecha, going in for 3b y a probarlo con arboles de nivel > 1
authorAlan Kennedy <kennedya@3dgames.com.ar>
Sat, 29 May 2004 19:04:10 +0000 (19:04 +0000)
committerAlan Kennedy <kennedya@3dgames.com.ar>
Sat, 29 May 2004 19:04:10 +0000 (19:04 +0000)
emufs/b_plus_test.c
emufs/indice_bplus.c

index 00f0c6b87f14c2b52dc346816b5a12645d7923b0..4e99c19aee84ce193e69c12b9e4b56e6e0a27e11 100644 (file)
@@ -26,10 +26,10 @@ querydata.clave.i_clave = i;
 emufs_b_plus_insertar(emu->indices,&querydata);
 }
 
 emufs_b_plus_insertar(emu->indices,&querydata);
 }
 
-/*printf("Insertando clave %i\n",3);
+printf("Insertando clave %i\n",3);
 querydata.num_bloque = 10;
 querydata.clave.i_clave = 3;
 querydata.num_bloque = 10;
 querydata.clave.i_clave = 3;
-emufs_b_plus_insertar(emu->indices,&querydata);*/
+emufs_b_plus_insertar(emu->indices,&querydata);
 
 /* NOTA: Deberia devolver el mismo 104 y Exitcode = -1 */
 querydata.num_bloque = 104;
 
 /* NOTA: Deberia devolver el mismo 104 y Exitcode = -1 */
 querydata.num_bloque = 104;
@@ -67,13 +67,13 @@ printf("Exit Code del Borrar Clave: %i\n",exitcode);
 querydata.clave.i_clave = 16;
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,2);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);*/
 querydata.clave.i_clave = 16;
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,2);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);*/
-/*querydata.clave.i_clave = 16;
+querydata.clave.i_clave = 16;
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);
 querydata.clave.i_clave = 32;
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0);
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);
 querydata.clave.i_clave = 32;
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0);
-printf("Exit Code del Borrar Clave: %i\n",exitcode);*/
-querydata.clave.i_clave = 2;
+printf("Exit Code del Borrar Clave: %i\n",exitcode);
+querydata.clave.i_clave = 8;
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);
 
 exitcode = emufs_b_plus_eliminar(emu->indices,querydata.clave,0);
 printf("Exit Code del Borrar Clave: %i\n",exitcode);
 
index 036d4cc612f6ad0b48dd4c80aa9705b52bbae081..c693803e21ff4ec8d43da9820a75562f8f806f69 100644 (file)
@@ -500,7 +500,7 @@ int emufs_b_plus_eliminar(INDICE *idx, CLAVE key, int num_node)
                                        }
                                        node_z->hijos[j] = node_z->hijos[j+1];
                                node_z->cant_claves--;
                                        }
                                        node_z->hijos[j] = node_z->hijos[j+1];
                                node_z->cant_claves--;
-                                       /* Grabo los cambios y listo */                                 
+                                       /* Grabo los cambios */                                 
                                        b_plus_grabar_nodo(idx,node_z,nodo->hijos[i+1]);
                                        b_plus_grabar_nodo(idx,node_y,nodo->hijos[i]);
                                        b_plus_grabar_nodo(idx,nodo,num_node);
                                        b_plus_grabar_nodo(idx,node_z,nodo->hijos[i+1]);
                                        b_plus_grabar_nodo(idx,node_y,nodo->hijos[i]);
                                        b_plus_grabar_nodo(idx,nodo,num_node);
@@ -513,7 +513,40 @@ int emufs_b_plus_eliminar(INDICE *idx, CLAVE key, int num_node)
                                                /* el sibling izquierdo me dara una key mediante rotacion Caso 3a */
                                                PERR("Entre caso 3a left sibling del eliminar");
                                                node_z = b_plus_leer_nodo(idx,nodo->hijos[i]);  
                                                /* el sibling izquierdo me dara una key mediante rotacion Caso 3a */
                                                PERR("Entre caso 3a left sibling del eliminar");
                                                node_z = b_plus_leer_nodo(idx,nodo->hijos[i]);  
-                                               node_y = b_plus_leer_nodo(idx,nodo->hijos[i-1]);
+                                               node_y = b_plus_leer_nodo(idx,nodo->hijos[i-1]);                                        
+                                               if (node_z->nivel == 0) es_hoja = 1;
+                                           /* Hago lugar en NodoZ para la clave que bajara desde el padre */                                           
+                                               /* Muevo el ultimo y restantes claves/punteros */
+                                               j = node_z->cant_claves - 1;                                                                                            
+                                               node_z->hijos[j+2] = node_z->hijos[j+1];
+                                       while (j >= 0){
+                                       node_z->claves[j+1] = node_z->claves[j];                        
+                                                       node_z->hijos[j+1] = node_z->hijos[j];
+                                       j--;
+                                       }                                               
+                                               /* Hago la rotacion final segun sea hoja o no */
+                                               if (es_hoja) {
+                                                       nodo->claves[i-1] = node_y->claves[cant_claves_lsibling-1];
+                                                       node_z->claves[0] = node_y->claves[cant_claves_lsibling-1];
+                                                       node_z->hijos[0] = node_y->hijos[cant_claves_lsibling-1];
+                                                       node_y->hijos[cant_claves_lsibling-1] = node_y->hijos[cant_claves_lsibling]; /* cadena */
+                                                       node_y->cant_claves--;
+                                                       node_z->cant_claves++;
+                                               } else {
+                                                       node_z->claves[0] = nodo->claves[i-1];
+                                                       node_z->hijos[0] = node_y->hijos[cant_claves_lsibling];
+                                                       nodo->claves[i-1] = node_y->claves[cant_claves_lsibling-1];
+                                                       node_y->cant_claves--;
+                                                       node_z->cant_claves++;
+                                               }
+                                               /* Grabo los cambios */                                         
+                                               b_plus_grabar_nodo(idx,node_y,nodo->hijos[i-1]);
+                                               b_plus_grabar_nodo(idx,node_z,nodo->hijos[i]);
+                                               b_plus_grabar_nodo(idx,nodo,num_node);
+                                               b_plus_destruir_nodo(node_y);
+                                               b_plus_destruir_nodo(node_z);                                   
+                                               /* Borro recursivamente KEY entrando por Child que ahora tiene minclaves+1 */
+                                               emufs_b_plus_eliminar(idx,key,nodo->hijos[i]);                                          
                                        } else {
                                                /* Caso 3b, debo bajar una clave y unificar con sibling disponible */
                                                PERR("Entre caso 3b del eliminar");
                                        } else {
                                                /* Caso 3b, debo bajar una clave y unificar con sibling disponible */
                                                PERR("Entre caso 3b del eliminar");