Пример #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;
        }
Пример #2
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;
         }
     }
 }
Пример #3
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;
                    }
                }
            }
        }
Пример #4
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);
                }
            }
        }
Пример #5
0
        private int Buscar(TPagina nodo, int x)
        {
            int i = 0;

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

            return(i);
        }
Пример #6
0
        private void buttonAgregar_Click(object sender, EventArgs e)
        {
            if (ChecaCampos())
            {
                WriteFile wf = new WriteFile(nombArchivo);
                //crear registro

                CrearRegistro();
                if (!File.Exists(nombArchivo))
                {
                    archivoCargado = true;
                    wf.CreaArchivo();
                    DeshabilitaMenu();
                }
                else if (!archivoCargado)
                {
                    MessageBox.Show
                    (
                        "El Archivo Ya Existe !!!",
                        "Danger",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation
                    );
                }

                if (archivoCargado)
                {
                    //insertar en arbol
                    arboles.Clave = registro.ClaveBusqueda;
                    arboles.InsercionEnArbolB(registro, nombArchivo);
                    numRegistros = arboles.Count += 1;
                    //leer archivo

                    // insertar en tabla

                    AgregarDatos();
                    LimpiaTablaArbol();
                    Carga();
                    TPagina aux = arboles.Raiz;
                    AgregaArbol(aux, 0);
                }
            }
            else
            {
                MessageBox.Show
                (
                    "Campos Vacios",
                    "Danger",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation
                );
            }
        }
Пример #7
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);
            }
        }
Пример #8
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;
 }
Пример #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);
        }
Пример #10
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);
        }
Пример #11
0
 private void buttonAbrir_Click(object sender, EventArgs e)
 {
     if (nombArchivo != "" && File.Exists(nombArchivo))
     {
         Carga();
         archivoCargado = true;
         DeshabilitaMenu();
         AgregarDatos();
         LimpiaTablaArbol();
         TPagina aux = arboles.Raiz;
         indexA = 0;
         AgregaArbol(aux, 0);
     }
     else
     {
         MessageBox.Show("El Archivo No Existe o Se Cambio de Lugar");
     }
 }
Пример #12
0
        private void buttonEliminar_Click(object sender, EventArgs e)
        {
            if (ExisteClave((int)numericUpDownEliminar.Value))
            {
                arboles.Clave = (int)numericUpDownEliminar.Value;
                arboles.EliminaEnArbolB(nombArchivo);
                AgregarDatos();
                LimpiaTablaArbol();
                Carga();
                TPagina aux = arboles.Raiz;
                indexA = 0;
                AgregaArbol(aux, 0);

                numericUpDownEliminar.Value = 0;
            }
            else
            {
                MessageBox.Show("no existe");
            }
        }
Пример #13
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));
                    }
                }
            }
        }
Пример #14
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;
        }
Пример #15
0
        public void EliminaEnArbolB(string nombreArchivo)
        {
            pag_n = new TPagina();
            TPagina   aux = new TPagina();
            WriteFile wf  = new WriteFile(nombreArchivo);
            bool      b;

            if (raiz != null)
            {
                b = BajaE(raiz, nombreArchivo);
                if (b && raiz.Tipo != H)
                {
                    raiz = pag_n;
                    wf.ModificaNodoIR(raiz);//if else
                    wf.EscribeCabecera(raiz.DireccionNodo);
                }
                else if (b)
                {
                    wf.ModificaNodo(raiz);//q
                }
            }
        }
Пример #16
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;
        }
Пример #17
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);
                }
            }
        }
Пример #18
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--;
        }
Пример #19
0
        private TPagina CreaPagina(int d, int t)
        {
            TPagina nuevo = new TPagina();
            int     i;


            nuevo.M         = 0;
            nuevo.Tipo      = t;
            nuevo.Claves    = new int[(2 * d) + 1];
            nuevo.Direccion = new long[(2 * d) + 2];
            if (nuevo.Tipo == H)
            {
                nuevo.Ptrs = null;
            }
            else
            {
                nuevo.Ptrs = new TPagina[(2 * d) + 2];
                for (i = 0; i < 2 * d + 1; i++)
                {
                    nuevo.SetPtrs(null, i);
                }
            }
            return(nuevo);
        }
Пример #20
0
 public void SetPtrs(TPagina nuevo, int position)
 {
     ptrs[position] = nuevo;
 }
Пример #21
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);
        }
Пример #22
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);
        }
Пример #23
0
 public Arboles(TPagina raiz)
 {
     this.raiz = raiz;
 }