Beispiel #1
0
 private void AgregaArbol(TPagina nodo, int i)
 {
     if (nodo != null)
     {
         if (nodo.Tipo != H)
         {
             CargaNodo(nodo, indexA);
             //MessageBox.Show(i.ToString());
             //i += 1;
             for (int j = 0; j < 5; j++)
             {
                 if (nodo.GetDireccion(j) > 0)
                 {
                     AgregaArbol(nodo.GetPtrs(j), ++indexA);
                 }
                 else
                 {
                     break;
                 }
             }
         }
         else
         {
             CargaNodo(nodo, indexA);
             // i += 1;
         }
     }
 }
Beispiel #2
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;
        }
Beispiel #3
0
        private TPagina InsertaFusion(TPagina nodo1, TPagina nodo2, int clave)
        {
            int i, j;

            TPagina aux;

            aux = CreaPagina(d, nodo1.Tipo);

            for (i = 0; i < nodo1.M; i++)
            {
                InsertaEnPag(aux, nodo1.GetClave(i), null, nodo1.GetDireccion(i));
                if (nodo1.Tipo != H)
                {
                    aux.SetPtrs(nodo1.GetPtrs(i), i);
                    aux.SetDireccion(nodo1.GetDireccion(i), i);
                }
            }

            if (aux.Tipo != H)
            {
                aux.SetPtrs(nodo1.GetPtrs(i), aux.M);
                // aux.SetDireccion(nodo1.GetDireccion(i), aux.M);
                InsertaEnPag(aux, clave, null, nodo1.GetDireccion(i));
                aux.SetDireccion(nodo1.GetDireccion(i), aux.M - 1);
            }


            i = aux.M;

            for (j = 0; j < nodo2.M; j++)
            {
                InsertaEnPag(aux, nodo2.GetClave(j), null, nodo2.GetDireccion(j));
                if (nodo2.Tipo != H)
                {
                    aux.SetPtrs(nodo2.GetPtrs(j), i + j);
                    aux.SetDireccion(nodo2.GetDireccion(j), i + j);
                }
            }

            if (aux.Tipo != H)
            {
                aux.SetPtrs(nodo2.GetPtrs(j), aux.M);
                aux.SetDireccion(nodo2.GetDireccion(j), aux.M);
            }

            return(aux);
        }
Beispiel #4
0
        private void PrestaClave(TPagina nodo1, TPagina nodo2, int cb)
        {
            if (nodo1.GetClave(nodo1.M - 1) > nodo2.GetClave(nodo2.M - 1))
            {
                //izquierda presta
                if (nodo1.Tipo != H)
                {
                    InsertaEnPag(nodo1, cb, nodo2.GetPtrs(nodo2.M), nodo2.GetDireccion(nodo2.M));
                    clave = nodo2.GetClave(nodo2.M - 1);
                    EliminaClave(nodo2, nodo2.GetClave(nodo2.M - 1));
                }
                else
                {
                    InsertaEnPag(nodo1, nodo2.GetClave(nodo2.M - 1), null, nodo2.GetDireccion(nodo2.M - 1));
                    clave = nodo2.GetClave(nodo2.M - 1);
                    EliminaClave(nodo2, nodo2.GetClave(nodo2.M - 1));
                }
            }
            else
            {
                if (nodo1.Tipo != H)
                {
                    InsertaEnPag(nodo1, cb, nodo2.GetPtrs(0), nodo2.GetDireccion(0));

                    EliminaClave(nodo2, nodo2.GetClave(0));
                    clave = nodo2.GetClave(0);
                }
                else
                {
                    // InsertaEnPag(nodo1, cb, null, nodo2.GetDireccion(0));
                    InsertaEnPag(nodo1, nodo2.GetClave(0), null, nodo2.GetDireccion(0));

                    EliminaClave(nodo2, nodo2.GetClave(0));
                    clave = nodo2.GetClave(0);
                }
            }
        }
Beispiel #5
0
        private void Divide(TPagina nodo)
        {
            TPagina aux;
            int     j;

            //cambiar RH por I
            aux = CreaPagina(d, nodo.Tipo == R ? I : nodo.Tipo);


            for (j = nodo.M - 1; j > d; j--, nodo.M--)
            {
                if (nodo.Tipo != H)
                {
                    InsertaEnPag(aux, nodo.GetClave(j), nodo.GetPtrs(j + 1), nodo.GetDireccion(j + 1));
                }
                else
                {
                    InsertaEnHoja(aux, nodo.GetClave(j), null, nodo.GetDireccion(j));
                }
            }
            if (nodo.Tipo != H)
            {
                aux.SetPtrs(nodo.GetPtrs(j + 1), 0);
                aux.SetDireccion(nodo.GetDireccion(j + 1), 0);
            }

            clave = nodo.GetClave(j);
            if (nodo.Tipo == H)
            {
                aux.SetClaves(clave, 0);
                aux.SetDireccion(nodo.GetDireccion(j), 0);
                aux.M++;
            }
            //printf("\nj: %d\n", j);
            pag_n = aux;
            nodo.M--;
        }
Beispiel #6
0
        public void Imprime(TPagina nodo)
        {
            int i;

            if (nodo != null)
            {
                for (i = 0; i < nodo.M; i++)
                {
                    Console.Write(nodo.GetClave(i) + " ");
                }
                Console.WriteLine();
                if (nodo.Tipo != H)
                {
                    for (i = 0; i <= nodo.M; i++)
                    {
                        Imprime(nodo.GetPtrs(i));
                    }
                }
            }
        }
Beispiel #7
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;
        }
Beispiel #8
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;
        }
Beispiel #9
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);
        }
Beispiel #10
0
        private bool Baja(TPagina nodo, Registro registro, string nombreArchivo)
        {
            bool      b  = false;
            WriteFile wf = new WriteFile(nombreArchivo);
            int       pos;

            if (nodo.Tipo == H)
            {
                wf.InsertaRegistro(registro);
                // wf.InsertaRegistro(registro, nodo.M > 0 ? nodo.GetDireccion(Buscar(nodo, clave) - 1) : -1, nodo.M > 0 ? nodo.GetDireccion(Buscar(nodo, clave)) : -1);
                InsertaEnPag(nodo, clave, null, registro.Direccion);
                // nodo.SetDireccion(registro.Direccion, nodo.M - 1);

                if (nodo.M > 2 * d)
                {
                    Divide(nodo);
                    b = true;
                }
                else
                {
                    wf.ModificaNodo(nodo);
                }
            }
            else
            {
                pos = Buscar(nodo, clave);
                b   = Baja(nodo.GetPtrs(pos), registro, nombreArchivo);
                if (b)
                {
                    if (pag_n.Tipo != H)
                    {
                        wf.InsertaNodoIR(pag_n);
                        wf.ModificaNodoIR(nodo.GetPtrs(pos));
                    }
                    else
                    {
                        wf.InsertaNodo(pag_n);
                        wf.ModificaNodo(nodo.GetPtrs(pos));
                    }
                    InsertaEnPag(nodo, clave, pag_n, pag_n.DireccionNodo);
                    //escribir pag_n y actualizar nodo en pos
                    //actualizar nodos despues de dividir



                    if (nodo.M > 2 * d)
                    {
                        Divide(nodo);
                    }
                    else
                    {
                        b = false;
                        if (nodo.Tipo != H)
                        {
                            wf.ModificaNodoIR(nodo);
                        }
                        else
                        {
                            wf.ModificaNodo(nodo);
                        }

                        //actualiza this nodo
                    }
                }
            }
            return(b);
        }