/**Escribe una tabla hash*/ public void EscribeTablaHash(CHash tabla) { bw.BaseStream.Seek(tabla.getDir(), SeekOrigin.Begin); bw.Write(tabla.getDir()); bw.Write(tabla.getTamaño()); bw.Write(tabla.getNumCubetas()); for (int i = 0; i < tabla.getTamaño(); bw.Write(tabla.getAtDirCubeta(i)), i++) ; }
private void ImprimeTablaHash(long dir) { if (dir != -1) { tablaHashStatic = getArchivo().LeerTablaHash(dir); for (int nC = 1, i = 0; i < tablaHashStatic.getTamaño(); i++, nC++) { tablaHash.Rows.Add(); tablaHash.Rows[i].HeaderCell.Value = nC.ToString(); tablaHash.Rows[i].Cells[0].Value = tablaHashStatic.getAtDirCubeta(i).ToString(); } } }
/**\brief Eliima un bloque de datos*/ private void EliminaBloque(CHash tablaH, CBloque b) { /** * \details * Se lleva a cabo la eliminación de algun registro. Aplicando la función has en la tabla y la cubeta * \param tablaH Tabla hash donde existe la cubeta * \param b Bloque a eliminar * */ Cubeta cubetaAux, cubetaAnt; long dirAux; cubetaAnt = cubetaAux = null; pH = pC = -1; FuncionHash(b, ref pH, ref pC);//Se hacen las funciones has en la tabla has y la cubeta dirAux = tablaH.getAtDirCubeta(pH); while (dirAux != -1)//Se intenta eliminar el registro { cubetaAux = getArchivo().LeerCubetaHashEstatica(dirAux); if (RegEliminado(cubetaAux, b, pC) == false) { cubetaAnt = cubetaAux; dirAux = cubetaAux.getSigCubeta(); } else break; } if (cubetaAux.getNumDirBloques() == 0) if (dirAux == tablaH.getAtDirCubeta(pH)) { tablaH.setAtDirCubeta(pH, cubetaAux.getSigCubeta()); if (cubetaAux.getSigCubeta() == -1) { tablaH.decNumCubetas(); cubetasRestantes = tablaH.getNumCubetas(); } getArchivo().EscribeTablaHash(tablaH); } else { cubetaAnt.setSigCubeta(cubetaAux.getSigCubeta()); getArchivo().EscribeCubetaHashEstatia(cubetaAnt); } }
/**\brief Inserta un bloque*/ public int InsDirBloque(CHash tablaH, int posCubeta, CBloque b, int fC) { /** * \details * Lleva a cabo la inserción de un bloque, utilizando la posición de fC, generada por la * función hash(Metodo de plegamiento) * \param tablaH Tabla Hash * \param posCuebta Posición de la cubeta * \param b Bloque a insertar * \param fC Posicion del bloque dentro de la tabla hash **/ Cubeta cubetaAux, cubetaAnt; long dirAux; int res = 1; cubetaAnt = cubetaAux = null; dirAux = tablaH.getAtDirCubeta(posCubeta); //Recorrido por las cubetas while (dirAux != -1 ) { cubetaAux = getArchivo().LeerCubetaHashEstatica(dirAux); if ((res = InsBloqueDatos(b, cubetaAux, fC)) == 2) { cubetaAnt = cubetaAux; dirAux = cubetaAux.getSigCubeta(); } else break; } if (res == 1) { if (tablaH.getAtDirCubeta(posCubeta) == -1)//Si no existen cubetas se crea la primera y se asocia con la entidad { cubetaAux = new Cubeta(getArchivo().ENDF(), TAM_CUBETA); res = InsBloqueDatos(b, cubetaAux, fC); getArchivo().EscribeCubetaHashEstatia(cubetaAux); tablaH.setAtDirCubeta(posCubeta, cubetaAux.getDir()); tablaH.incNumCubetas(); getArchivo().EscribeTablaHash(tablaH); } else if (dirAux == -1) { cubetaAux = new Cubeta(getArchivo().ENDF(), TAM_CUBETA); res = InsBloqueDatos(b, cubetaAux, fC); getArchivo().EscribeCubetaHashEstatia(cubetaAux); cubetaAnt.setSigCubeta(cubetaAux.getDir()); getArchivo().EscribeCubetaHashEstatia(cubetaAnt); } else if (res == 1) getArchivo().EscribeCubetaHashEstatia(cubetaAux); } return (res); }