Beispiel #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;
        }
Beispiel #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;
                    }
                }
            }
        }
Beispiel #3
0
        private void CargaNodo(TPagina nodo, int k)
        {
            // LimpiaTablaArbol();

            dataGridView2.Rows.Add();
            dataGridView2.Rows[k].Cells[0].Value  = nodo.DireccionNodo;
            dataGridView2.Rows[k].Cells[1].Value  = nodo.Tipo;
            dataGridView2.Rows[k].Cells[2].Value  = nodo.GetDireccion(0);
            dataGridView2.Rows[k].Cells[3].Value  = nodo.GetClave(0);
            dataGridView2.Rows[k].Cells[4].Value  = nodo.GetDireccion(1);
            dataGridView2.Rows[k].Cells[5].Value  = nodo.GetClave(1);
            dataGridView2.Rows[k].Cells[6].Value  = nodo.GetDireccion(2);
            dataGridView2.Rows[k].Cells[7].Value  = nodo.GetClave(2);
            dataGridView2.Rows[k].Cells[8].Value  = nodo.GetDireccion(3);
            dataGridView2.Rows[k].Cells[9].Value  = nodo.GetClave(3);
            dataGridView2.Rows[k].Cells[10].Value = nodo.GetDireccion(4);
        }
Beispiel #4
0
        private int Buscar(TPagina nodo, int x)
        {
            int i = 0;

            while (i < nodo.M && nodo.GetClave(i) <= x)
            {
                i++;
            }

            return(i);
        }
Beispiel #5
0
        public void InsertaNodoIR(TPagina Nodo)
        {
            long r = -1;
            int  c = -1;

            try
            {
                using (FileStream fs = new FileStream(
                           path,
                           FileMode.Open,
                           FileAccess.Write))
                {
                    fs.Seek(0, SeekOrigin.End);
                    using (BinaryWriter bw = new BinaryWriter(fs))
                    {
                        Nodo.DireccionNodo = fs.Position;
                        bw.Write(fs.Position);

                        bw.Write(Nodo.Tipo);

                        for (int i = 0; i < Nodo.Claves.Length; i++)
                        {
                            if (i < Nodo.M)
                            {
                                bw.Write(Nodo.GetDireccion(i));
                                bw.Write(Nodo.GetClave(i));
                            }
                            else if (i == Nodo.M && Nodo.GetDireccion(i) > 0)
                            {
                                bw.Write(Nodo.GetDireccion(Nodo.M));
                                if (i < Nodo.Claves.Length - 1)
                                {
                                    bw.Write(c);
                                }
                            }
                            else
                            {
                                bw.Write(r);
                                if (i < Nodo.Claves.Length - 1)
                                {
                                    bw.Write(c);
                                }
                            }
                        }
                    }
                }
            }
            catch (FileNotFoundException ioE)
            {
                Console.WriteLine(ioE);
            }
        }
Beispiel #6
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 #7
0
 private void Fusiona(TPagina nodo1, TPagina nodo2, int clave)
 {
     if (nodo1.GetClave(nodo1.M - 1) < nodo2.GetClave(nodo2.M - 1))
     {
         //fusion derecha
         pag_n = InsertaFusion(nodo1, nodo2, clave);
     }
     else
     {
         pag_n = InsertaFusion(nodo2, nodo1, clave);
     }
     pag_n.Tipo          = nodo2.Tipo;//q
     pag_n.DireccionNodo = nodo2.DireccionNodo;
 }
Beispiel #8
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 #9
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 #10
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 #11
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 #12
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 #13
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);
        }