/**Se escribe la tabla hash extendible de la organización hash dinámica*/ public void EscribeTablaHashExt(CTablaHashExt t) { bw.BaseStream.Seek(t.getDir(), SeekOrigin.Begin); bw.Write(t.getDir()); bw.Write(t.getPrefAsociacion()); bw.Write(t.getCabEntradas()); bw.Write(t.getNumReg()); }
/**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); }
private CTablaHashExt creaTabla(CTablaHashExt tH) { CTablaHashExt nueva; CEntrada entAux; nueva = new CTablaHashExt(); nueva.setPrefAsociacion(tH.getPrefAsociacion()); nueva.setNumReg(tH.getNumReg()); foreach (CEntrada e in tH.getListEntradas()) { entAux = new CEntrada(); entAux.setID(e.getID()); entAux.setEspejo(e.getEspejo()); nueva.insEntrada(entAux); } return (nueva); }