Exemple #1
0
        private void InsertaEnPag(TPagina nodo, int clave, TPagina nuevo, long dir)
        {
            int i;

            for (i = nodo.M - 1; i >= 0 && nodo.GetClave(i) > clave; i--)
            {
                nodo.SetClaves(nodo.GetClave(i), i + 1);
                if (nodo.Tipo == H)
                {
                    nodo.SetDireccion(nodo.GetDireccion(i), i + 1);
                }
                if (nodo.Tipo != H)
                {
                    nodo.SetDireccion(nodo.GetDireccion(i + 1), i + 2);
                    nodo.SetPtrs(nodo.GetPtrs(i + 1), i + 2);
                }
            }
            //  printf("\ni: %d\n", i);
            nodo.SetClaves(clave, i + 1);
            if (nodo.Tipo == H)
            {
                nodo.SetDireccion(dir, i + 1);
            }
            if (nodo.Tipo != H)
            {
                nodo.SetDireccion(dir, i + 2);
                nodo.SetPtrs(nuevo, i + 2);
            }
            nodo.M += 1;
        }
Exemple #2
0
        private void CargaNodo(TPagina nodo, FileStream fs, long direccion)
        {
            fs.Seek(direccion, SeekOrigin.Begin);
            byte[] a = new byte[sizeof(long)];
            fs.Read(a, 0, sizeof(long));
            nodo.DireccionNodo = BitConverter.ToInt64(a, 0);
            a = new byte[sizeof(int)];
            fs.Read(a, 0, sizeof(int));
            nodo.Tipo = BitConverter.ToInt32(a, 0);

            int i;

            for (i = 0; i < 5; i++)
            {
                a = new byte[sizeof(long)];
                fs.Read(a, 0, sizeof(long));
                nodo.SetDireccion(BitConverter.ToInt64(a, 0), i);

                if (i < 4)
                {
                    a = new byte[sizeof(int)];
                    fs.Read(a, 0, sizeof(int));
                    nodo.SetClaves(BitConverter.ToInt32(a, 0), i);
                    if (nodo.GetClave(i) > 0)
                    {
                        nodo.M = i + 1;
                    }
                }
            }
        }
Exemple #3
0
        public void InsercionEnArbolB(Registro registro, string nombreArchivo)
        {
            pag_n = new TPagina();
            TPagina aux = new TPagina();

            WriteFile wf = new WriteFile(nombreArchivo);
            bool      b;


            if (raiz == null)
            {
                raiz = CreaPagina(d, H);
                raiz.SetClaves(clave, 0);
                raiz.M            += 1;
                raiz.DireccionNodo = 8;

                wf.EscribeCabecera(raiz.DireccionNodo);
                wf.InsertaNodo(raiz);
                wf.InsertaRegistro(registro);

                raiz.SetDireccion(registro.Direccion, 0);
                wf.ModificaNodo(raiz);
            }
            else
            {
                b = Baja(raiz, registro, nombreArchivo);
                if (b)
                {
                    aux       = CreaPagina(d, R);
                    raiz.Tipo = pag_n.Tipo;
                    aux.SetPtrs(raiz, 0);
                    aux.SetDireccion(raiz.DireccionNodo, 0);
                    aux.SetClaves(clave, 0);
                    aux.SetPtrs(pag_n, 1);
                    if (pag_n.Tipo != H)
                    {
                        wf.InsertaNodoIR(pag_n);
                        wf.ModificaNodoIR(raiz);
                    }
                    else
                    {
                        wf.InsertaNodo(pag_n);
                        wf.ModificaNodo(raiz);
                    }

                    aux.SetDireccion(pag_n.DireccionNodo, 1);
                    aux.M++;


                    raiz = aux;
                    wf.InsertaNodoIR(raiz);
                    wf.EscribeCabecera(raiz.DireccionNodo);
                }
            }
        }
Exemple #4
0
        private void InsertaEnHoja(TPagina nodo, int clave, TPagina nuevo, long dir)
        {
            int i;

            for (i = nodo.M - 1; i >= 0 && nodo.GetClave(i + 1) > clave; i--)
            {
                nodo.SetClaves(nodo.GetClave(i + 1), i + 2);
                nodo.SetDireccion(nodo.GetDireccion(i + 1), i + 2);
                if (nodo.Tipo != H)
                {
                    nodo.SetPtrs(nodo.GetPtrs(i + 2), i + 3);
                }
            }

            nodo.SetClaves(clave, i + 2);
            nodo.SetDireccion(dir, i + 2);
            if (nodo.Tipo != H)
            {
                nodo.SetPtrs(nuevo, i + 3);
            }
            nodo.M += 1;
        }
Exemple #5
0
        private void EliminaClave(TPagina nodo, int clave)
        {
            int i, index = Buscar(nodo, clave);


            for (i = Buscar(nodo, clave) - 1; i < nodo.M; i++)
            {
                nodo.SetClaves(nodo.GetClave(i + 1), i);
                nodo.SetDireccion(nodo.GetDireccion(i + 1), i);
                if (nodo.Tipo != H)
                {
                    nodo.SetPtrs(nodo.GetPtrs(i + 2), i + 1);
                }
            }
            if (nodo.Tipo != H)
            {
                nodo.SetPtrs(pag_n, index - 1 >= 0 ? index - 1 : 0);
                nodo.SetDireccion(pag_n.DireccionNodo, index - 1 >= 0 ? index - 1 : 0);
            }

            nodo.M -= 1;
        }
Exemple #6
0
        private bool BajaE(TPagina nodo, string nombreArchivo)
        {
            bool      b  = false;
            WriteFile wf = new WriteFile(nombreArchivo);
            int       pos;

            if (nodo.Tipo == H)
            {
                //buscar clave tomar direccion y modificar archivo
                //  wf.EliminaRegistro(nodo.GetDireccion(Buscar(nodo, clave) - 1), nodo.GetDireccion(Buscar(nodo, clave)));
                EliminaClave(nodo, clave);
                if (nodo.M < d)
                {
                    b = true;
                }
                else
                {
                    wf.ModificaNodo(nodo);
                }
            }
            else
            {
                pos = Buscar(nodo, clave);
                b   = BajaE(nodo.GetPtrs(pos), nombreArchivo);
                if (b)
                {
                    if (pos - 1 >= 0)
                    {
                        if (nodo.GetPtrs(pos - 1).M > d /*&& nodo.GetPtrs(pos-1).Tipo == H*/)
                        {
                            PrestaClave(nodo.GetPtrs(pos), nodo.GetPtrs(pos - 1), nodo.GetClave(pos - 1));
                            nodo.SetClaves(clave, pos - 1);

                            //  wf.ModificaNodoIR(nodo);
                            if (nodo.GetPtrs(pos).Tipo != H)
                            {
                                wf.ModificaNodoIR(nodo.GetPtrs(pos));
                                wf.ModificaNodoIR(nodo.GetPtrs(pos - 1));
                            }
                            else
                            {
                                wf.ModificaNodo(nodo.GetPtrs(pos));
                                wf.ModificaNodo(nodo.GetPtrs(pos - 1));
                            }
                        }
                        else
                        {
                            Fusiona(nodo.GetPtrs(pos), nodo.GetPtrs(pos - 1), nodo.GetClave(pos - 1)); //modifica clave
                                                                                                       //   clave = (pos == 0) ? 0 : pos - 1;
                            clave = nodo.GetClave(pos - 1);
                            EliminaClave(nodo, clave);

                            //wf.ModificaNodoIR(nodo);
                            if (pag_n.Tipo != H)
                            {
                                wf.ModificaNodoIR(pag_n);
                            }
                            else
                            {
                                wf.ModificaNodo(pag_n);
                            }
                            //agregar ptr y clave eliminada
                        }
                    }
                    else
                    {
                        if (nodo.GetPtrs(pos + 1).M > d /*&& nodo.GetPtrs(pos).Tipo == H*/)
                        {
                            PrestaClave(nodo.GetPtrs(pos), nodo.GetPtrs(pos + 1), nodo.GetClave(pos));
                            nodo.SetClaves(clave, pos);

                            //  wf.ModificaNodoIR(nodo);
                            if (nodo.GetPtrs(pos).Tipo != H)
                            {
                                wf.ModificaNodoIR(nodo.GetPtrs(pos));
                                wf.ModificaNodoIR(nodo.GetPtrs(pos + 1));
                            }
                            else
                            {
                                wf.ModificaNodo(nodo.GetPtrs(pos));
                                wf.ModificaNodo(nodo.GetPtrs(pos + 1));
                            }
                        }
                        else
                        {
                            Fusiona(nodo.GetPtrs(pos), nodo.GetPtrs(pos + 1), nodo.GetClave(pos)); //modifica clave
                                                                                                   //   clave = (pos == 0) ? 0 : pos - 1;
                            clave = nodo.GetClave(pos);
                            EliminaClave(nodo, clave);

                            // wf.ModificaNodoIR(nodo);
                            if (pag_n.Tipo != H)
                            {
                                wf.ModificaNodoIR(pag_n);
                            }
                            else
                            {
                                wf.ModificaNodo(pag_n);
                            }
                            //agregar nuevo nodo fusionado
                        }
                    }

                    if (nodo.Tipo == R && nodo.M <= 0)
                    {
                        if (pag_n.Ptrs == null)
                        {
                            pag_n.Tipo = H;
                        }
                        else
                        {
                            pag_n.Tipo = R;
                        }
                    }

                    if (nodo.M >= d && nodo.Tipo != R)
                    {
                        b = false;
                    }
                    else if (nodo.M > 0 && nodo.Tipo == R)
                    {
                        b = false;
                    }
                    if (!b)
                    {
                        wf.ModificaNodoIR(nodo);
                        //modificar nodo actual
                    }
                }
            }
            return(b);
        }