コード例 #1
0
ファイル: CArchivo.cs プロジェクト: miguellgt/file-structures
        /**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++) ;
        }
コード例 #2
0
        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();
                }
            }
        }
コード例 #3
0
        /**\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);
                }
        }
コード例 #4
0
        /**\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);
        }