if (nodo_id != 0) {
int izq_id, der_id, pos_padre, i;
B_NodoHeader padre_header, header_der, header_izq;
- B_NodoEntry *padre_claves;
- B_NodoEntry a_pasar, *buffer;
+ B_NodoEntry *padre_claves, nuevo_entry;
+ B_NodoEntry a_pasar, *buffer, clave_que_sale;
b_leer_header(padre, &padre_header);
padre_claves = b_leer_claves(padre, &padre_header);
buffer = malloc((nodo_header.cant+1)*sizeof(B_NodoEntry));
+ nuevo_entry.clave = clave;
+ nuevo_entry.dato = dato;
+ nuevo_entry.hijo_derecho = hijo2;
+
/* Inserto ordenado */
for(i=0; (i<nodo_header.cant) && emufs_indice_es_menor(idx, claves[i].clave, clave); i++)
buffer[i] = claves[i];
- buffer[i].clave = clave;
- buffer[i].dato = dato;
- buffer[i].hijo_derecho = hijo2;
- while (i<nodo_header.cant)
+ buffer[i] = nuevo_entry;
+ while (i<nodo_header.cant) {
buffer[i+1] = claves[i];
+ i++;
+ }
if ((der_id != -1) && (header_der.cant < CANT_HIJOS(idx))) {
/* tomo la clave mas grande */
/* la paso a la derecha */
b_pasar_clave_a_derecha(idx, der, der_id, padre, nodo_header.padre, pos_padre, a_pasar);
- /* XXX TODO Liberar memoria y GUARDAR*/
+ /* Dejo en nodo las claves que corresponden */
+ memcpy(claves, buffer, nodo_header.cant*sizeof(B_NodoEntry));
+ b_grabar_nodo(idx, der_id, der);
+ b_grabar_nodo(idx, nodo_header.padre, padre);
+ b_grabar_nodo(idx, nodo_id, nodo);
free(buffer);
-
+ free(nodo);
+ free(der);
+ free(padre);
return;
}
if ((izq_id != -1) && (header_izq.cant < CANT_HIJOS(idx))) {
+ PERR("ESTOY PASANDO CLAVE A IZQUIERDA");
a_pasar = buffer[0];
- b_pasar_clave_a_izquierda(idx, izq, izq_id, padre, nodo_header.padre, pos_padre, a_pasar, 0, 0);
+ fprintf(stderr, "YO=%d , a_pasar=%d\n", clave.i_clave, a_pasar.clave.i_clave);
+ b_pasar_clave_a_izquierda(idx, izq, izq_id, padre, nodo_header.padre, pos_padre, a_pasar, hijo1, padre_claves[pos_padre].hijo_derecho);
+ /* Pongo las claves que quedan en el nodo */
+ memcpy(claves, buffer+1, nodo_header.cant*sizeof(B_NodoEntry));
+ b_grabar_nodo(idx, izq_id, izq);
+ b_grabar_nodo(idx, nodo_header.padre, padre);
+ b_grabar_nodo(idx, nodo_id, nodo);
free(buffer);
+ free(nodo);
+ free(izq);
+ free(padre);
return;
}
-
- /*
+
+ /* Tengo que partir, tengo que sacar una clave del padre y mandarla al partir */
+ clave_que_sale = padre_claves[pos_padre];
+ clave_que_sale.hijo_derecho = -1;
+ for(i=pos_padre; i<padre_header.cant-1; i++)
+ padre_claves[i] = padre_claves[i+1];
+ padre_header.cant--;
+ b_actualizar_header(padre, &padre_header);
+ b_grabar_nodo(idx, nodo_header.padre, padre);
if (izq_id != -1)
- b_partir_dos_nodos_en_tres(idx, hijo_izquierdo, nodo, padre, nuevo_entry)
+ b_partir_dos_nodos_en_tres(idx, izq_id, nodo_id, clave_que_sale, nuevo_entry, nodo_header.padre);
else // Siempre alguno tiene que existir.
- b_partir_dos_nodos_en_tres(idx, nodo, hijo_derecho, padre, nuevo_entry)
+ b_partir_dos_nodos_en_tres(idx, nodo_id, der_id, clave_que_sale, nuevo_entry, nodo_header.padre);
return;
- */
}
/* Bueno, soy la raiz, tengo que tratarla como el arbol B */