From: Ricardo Markiewicz Date: Thu, 13 May 2004 19:37:31 +0000 (+0000) Subject: Modifico el arbol b porque lo estaba haciendo mal (mal manejo de los datos y los... X-Git-Tag: svn_import_r684~252 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/e8fa2ccccf10bdfcff1aedbaf919f3bc823f1ecf?ds=inline Modifico el arbol b porque lo estaba haciendo mal (mal manejo de los datos y los hijos) --- diff --git a/emufs/indice_b.c b/emufs/indice_b.c index 2e0ff5d..9a9e9fe 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -71,21 +71,11 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato) return 0; } else { if (i == 0) { - if (header.nivel != 0) { - nodo = b_leer_nodo(idx, header.hijo_izquierdo); - nodo_id = header.hijo_izquierdo; - } else { - nodo = NULL; - nodo_id = -1; - } + nodo = b_leer_nodo(idx, header.hijo_izquierdo); + nodo_id = header.hijo_izquierdo; } else { - if (header.nivel != 0) { - nodo = b_leer_nodo(idx, claves[i-1].dato.bloque); - nodo_id = claves[i-1].dato.bloque; - } else { - nodo = NULL; - nodo_id = -1; - } + nodo = b_leer_nodo(idx, claves[i-1].hijo_derecho); + nodo_id = claves[i-1].hijo_derecho; } } } @@ -121,7 +111,7 @@ INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave) if (i == 0) { nodo = b_leer_nodo(idx, header.hijo_izquierdo); } else { - nodo = b_leer_nodo(idx, claves[i-1].dato.bloque); + nodo = b_leer_nodo(idx, claves[i-1].hijo_derecho); } free(tmp); } @@ -272,6 +262,8 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n } tmp_claves[i].clave = clave; tmp_claves[i].dato = dato; + tmp_claves[i].hijo_derecho = hijo1; + tmp_claves[i+1].hijo_derecho = hijo2; while (i < nodo_header.cant) { tmp_claves[i+1] = claves[i]; i++; @@ -298,7 +290,7 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n if (nodo_id != 0) { clave = tmp_claves[total/2].clave; - dato.bloque = nuevo_id; + /* XXX dato.bloque = nuevo_id; */ b_grabar_nodo(idx, nodo_id, nodo); b_grabar_nodo(idx, nuevo_id, nuevo); @@ -321,7 +313,7 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n nodo = tmp_nuevo; clave = tmp_claves[total/2].clave; - dato.bloque = nuevo_id; + /* XXX dato.bloque = nuevo_id; */ b_grabar_nodo(idx, nuevo_id+1, nodo); b_grabar_nodo(idx, nuevo_id, nuevo); @@ -359,7 +351,8 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n nodo_header.cant++; claves[i].clave = clave; claves[i].dato = dato; - nodo_header.hijo_izquierdo = b_elegir_izquierdo(idx, nodo_header.hijo_izquierdo, hijo1); + claves[i].hijo_derecho = hijo2; + nodo_header.hijo_izquierdo = hijo1; /*b_elegir_izquierdo(idx, nodo_header.hijo_izquierdo, hijo1);*/ b_actualizar_header(nodo, &nodo_header); b_grabar_nodo(idx, nodo_id, nodo); diff --git a/emufs/indice_b.h b/emufs/indice_b.h index 4385c61..7093de2 100644 --- a/emufs/indice_b.h +++ b/emufs/indice_b.h @@ -21,7 +21,6 @@ typedef struct _b_nodo_header_ { } B_NodoHeader; typedef struct _b_nodo_entry_ { - /* FIXME usar tipo CLAVE */ CLAVE clave; /* Si el nivel del nodo == 0, quiere decir que es el * bloque del archivo de datos donde esta el registro. @@ -29,6 +28,8 @@ typedef struct _b_nodo_entry_ { * del archivo de indice donde buscar */ INDICE_DATO dato; + /* El ID de la hoja de depliega a la derecha */ + int hijo_derecho; } B_NodoEntry; /* Crea un arbol */ diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 50219f8..59a3f35 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -214,29 +214,23 @@ t_Articulo *art_obtener(t_LstArticulos *lst, int numero, EMUFS_REG_ID *id) if (lst == NULL) lst = lst_articulos; if (lst == NULL) return NULL; - fprintf(stderr, "Me piden que busque en el indice el codigo=%d\n", numero); (*id) = -1; /* XXX Ver que se hacia con esto */ art = (t_Articulo *)malloc(sizeof(t_Articulo)); /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */ error = 0; - PERR("Genero clave"); k = emufs_indice_generar_clave_desde_valor(lst->fp->indices, (char *)&numero); - PERR("Buscando en archivo"); tmp = lst->fp->leer_registro(lst->fp, k, &size, &error); - PERR("Lo encontre?"); if (error) { free(art); return NULL; } - printf("SI LO ENCONTRE!!!!"); if (procesar_leer_articulo(art, tmp, size, lst_articulos) != 1) { free(art); free(tmp); return NULL; } - printf("RETORNANDO el articulo procesado"); free(tmp); return art; } @@ -379,11 +373,12 @@ void art_agregar(char *s) WINDOW *win; t_Form *form; t_Articulo art; - t_Reg_Articulo *nuevo; void *save; int error = 0, existe; EMUFS_REG_SIZE size; EMUFS_REG_ID id; + INDICE_DATO dato; + CLAVE k; win = newwin(9, COLS-2, 13, 1); box(win, 0, 0); @@ -401,15 +396,11 @@ void art_agregar(char *s) art.numero = atoi(form_obtener_valor_char(form, "Numero de Artículo")); existe = 0; - nuevo = lst_articulos->primero; - while (nuevo) { - if (art.numero == nuevo->numero) { - existe = 1; - break; - } - nuevo = nuevo->sig; - } - + /* Me dijo que no existe el codigo */ + k = emufs_indice_generar_clave_desde_valor(lst_articulos->fp->indices, (char *)&art.numero); + dato = lst_articulos->fp->indices->existe_entrada(lst_articulos->fp->indices, k); + if (dato.id != -1) existe = 1; + if (!existe) { strcpy(art.desc, form_obtener_valor_char(form, "Descripción")); strcpy(art.presentacion, form_obtener_valor_char(form, "Presentación")); @@ -429,8 +420,6 @@ void art_agregar(char *s) wattroff(win, COLOR_PAIR(COLOR_YELLOW)); wrefresh(win); getch(); - } else { - agregar_nodo_articulo(lst_articulos, crear_nodo_articulo(id, art.numero)); } free(save); }