private void ImprimeTablaHash(long dir) { dGTablaHash.Rows.Clear(); dGCubeta.Rows.Clear(); tablaDatos.Rows.Clear(); btI.Text = ""; btIJ.Text = ""; if (dir != -1) { tHashExt = getArchivo().LeerTablaHashExt(dir); btI.Text = "i = " + tHashExt.getPrefAsociacion().ToString(); for (int nC = 0, i = 0; i < tHashExt.getListEntradas().Count; i++, nC++) { dGTablaHash.Rows.Add(); dGTablaHash.Rows[i].HeaderCell.Value = nC.ToString(); dGTablaHash.Rows[i].Cells[0].Value = tHashExt.getAtEntrada(i).getDirCubeta().ToString(); } ImprimeCubeta(0); } }
/**Elimina un bloque el forma logica y fisica*/ public bool EliminaBloque(CBloque b, CTablaHashExt tH) { CEntrada entradaAux; CCubeta cubetaAux; int numEnt; bool res, band = false ; numEnt = ConvertDecimal(tH,b.ConvertClaveToBinary());//Se obtiene la poscion de la entrada entradaAux = tH.getListEntradas()[numEnt];//Se carga la entrada cubetaAux = entradaAux.getCubeta(); //Se elimina la clave de cuebta leida res = cubetaAux.eliminaClave(FuncionHash(b), b, getArchivo()); getArchivo().EscribeCubeta(cubetaAux); tH.decNumReg(); getArchivo().EscribeTablaHashExt(tH); if (res == true)//Si es verdadero es porque la cubeta se quedo vacia if (tH.getPrefAsociacion() == 0) band = true; else if (cubetaAux.getPrefAsoc() == tH.getPrefAsociacion())//Se checa los estados de prefijos, en la cubeta y la tabla hash { entradaAux.setCubeta(tH.getAtEntrada(entradaAux.getEspejo()).getCubeta()); getArchivo().EscribeEntrada(entradaAux); entradaAux.getCubeta().DecPrefAsoc(); getArchivo().EscribeCubeta(entradaAux.getCubeta()); while (!tH.validaPrefijos()) tH.Doblate(getArchivo()); if (tH.getNumReg() == 0) band = true; } return (band); }
/**Se lee una objeto de la clase CTablaHashExt que sera utilizada el la Hash Dinámica*/ public CTablaHashExt LeerTablaHashExt(long dir) { CTablaHashExt tExt; CEntrada entradaAux; CCubeta cubetaAux; long aux; int posCub; entradaAux = null; tExt = null; if (dir != -1) { tExt = new CTablaHashExt(); br.BaseStream.Seek(dir, SeekOrigin.Begin); tExt.setDir(br.ReadInt64()); tExt.setPrefAsociacion(br.ReadInt32()); tExt.setCabEntradas(br.ReadInt64()); tExt.setNumReg(br.ReadInt32()); aux = tExt.getCabEntradas(); while (aux != -1) { entradaAux = LeerEntrada(aux); cubetaAux = LeerCubeta(entradaAux.getDirCubeta()); if ((posCub = buscaCubeta(cubetaAux.getDir(), tExt)) == -1) entradaAux.setCubeta(cubetaAux); else entradaAux.setCubeta(tExt.getAtEntrada(posCub).getCubeta()); tExt.insEntrada(entradaAux); aux = entradaAux.getSigEntrada(); } } return (tExt); }