示例#1
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);
                }
            }
        }
示例#2
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
                );
            }
        }
示例#3
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
                }
            }
        }
示例#4
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);
        }
示例#5
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);
        }