コード例 #1
0
        public int Indice(NodoB Actual, Bebida Nuevo)
        {
            var iActualndice  = 0;
            var listacomparar = new List <Bebida>();

            foreach (var item in Actual.Datos)
            {
                if (item != null)
                {
                    listacomparar.Add(item);
                }
            }


            for (iActualndice = 0; iActualndice <= listacomparar.Count; iActualndice++)
            {
                if (iActualndice == listacomparar.Count)
                {
                    break;
                }
                else if (String.Compare(Nuevo.Nombre, listacomparar[iActualndice].Nombre) == -1)
                {
                    break;
                }
            }


            return(iActualndice);
        }
コード例 #2
0
 public bool EstaLleno(NodoB Actual)
 {
     for (int i = 0; i < Actual.Grado - 1; i++)
     {
         if (Actual.Datos[i] == null)
         {
             return(false);
         }
     }
     SortDatos(ref Actual.Datos);
     return(true);
 }
コード例 #3
0
        public void Navegar(Bebida Nuevo, NodoB Actual)
        {
            var indice = Indice(Actual, Nuevo);

            if (Actual.Hijos[indice] != null)
            {
                Navegar(Nuevo, Actual.Hijos[indice]);
            }
            else
            {
                //insertar
                InsertarEnHoja(ref Actual, Nuevo, ref Actual.Padre);
            }
        }
コード例 #4
0
        public void EncontrarEspacio(ref NodoB Raiz, Bebida Nuevo, ref NodoB Actual)
        {
            var IndiceCorrecto = EncontrarHoja(Nuevo);

            if (Actual.Hijos[IndiceCorrecto] == null)
            {
                // es hoja
                Singleton.Instance.IndiceHijoActual = IndiceCorrecto;
                InsertarEnHoja(ref Actual, Nuevo, ref Raiz);
            }
            else
            {
                // no es hoja
                Singleton.Instance.IndiceHijoActual = IndiceCorrecto;
                EncontrarEspacio(ref Raiz, Nuevo, ref Actual.Hijos[IndiceCorrecto]);
            }
        }
コード例 #5
0
        public bool EsHoja(ref NodoB Actual)
        {
            bool resultado = false;

            for (int i = 0; i < Actual.Grado; i++)
            {
                if (Actual.Hijos[i] != null)
                {
                    resultado = true;
                    break;
                }
                else
                {
                    resultado = true;
                }
            }
            return(resultado);
        }
コード例 #6
0
        public Bebida RetornaBuscar(string Nombre, ref NodoB Actual)
        {
            var ABuscar = new Bebida
            {
                Nombre = Nombre
            };

            //busca en el actual
            for (int i = 0; i < Actual.Grado - 1; i++)
            {
                //no validara si son null
                if (Actual.Datos[i] != null && Actual.Datos[i].Nombre == Nombre)
                {
                    return(Actual.Datos[i]);
                }
            }
            //si no esta, va a la hoja correspondiente

            //var Indice = EncontrarHoja(ABuscar);
            return(null);
        }
コード例 #7
0
        public void PrimeraSeparacion(NodoB Actual, Bebida Nuevo)
        {
            var AuxPartir = new Bebida[Actual.Grado];
            var contador  = 0;

            foreach (var item in Actual.Datos)
            {
                AuxPartir[contador] = item;
                contador++;
            }
            AuxPartir[contador] = Nuevo;
            SortDatos(ref AuxPartir);
            Actual = new NodoB(Actual.Grado);
            //asignamos el del centro al nuevo padre
            Actual.Datos[0] = AuxPartir[(Actual.Grado / 2)];
            for (int i = 0; i < Actual.Grado; i++)
            {
                Actual.Hijos[i] = new NodoB(Actual.Grado);
            }
            //asignamos los izquierdos
            contador = 0;
            for (int i = 0; i < AuxPartir.Length / 2; i++)
            {
                Actual.Hijos[0].Datos[contador] = AuxPartir[i];
                contador++;
            }
            //asignamos los Derechos

            contador = 0;
            for (int i = (AuxPartir.Length / 2) + 1; i < AuxPartir.Length; i++)
            {
                Actual.Hijos[1].Datos[contador] = AuxPartir[i];
                contador++;
            }

            Singleton.Instance.Raiz = Actual;
            Singleton.Instance.PrimeraSeparacion = true;
        }
コード例 #8
0
        public void InsertarEnHoja(ref NodoB Hoja, Bebida Nuevo, ref NodoB Padre)
        {
            // No encontro un espacio, hay que partir
            if (EstaLleno(Hoja) && Padre != null && EstaLleno(Hoja.Padre))
            {
                Segunda(ref Nuevo);
                return;
            }

            bool insertado = false;
            var  indice    = 0;

            //si no se inserta, seguira buscando hasta encontrar o que haya que partir
            while (!insertado)
            {
                if (indice == (Hoja.Grado - 1))
                {
                    PartirHijo(ref Hoja, ref Hoja.Padre, Nuevo);
                    insertado = true;
                }
                else
                {
                    // encontro un espacio deisponible, no Paarte
                    if (Hoja.Datos[indice] == null)
                    {
                        Hoja.Padre         = Padre;
                        Hoja.Datos[indice] = Nuevo;
                        SortDatos(ref Hoja.Datos);
                        insertado = true;
                    }
                    else
                    {
                        indice++;
                    }
                }
            }
        }
コード例 #9
0
 public string Buscar(Bebida Nuevo, NodoB Actual)
 {
     // bool encontrado = false;
     for (int i = 0; i < Actual.Datos.Length; i++)
     {
         if (Actual.Datos[i] == null)
         {
             break;
         }
         else
         {
             var indice = Indice(Actual, Nuevo);
             if (Actual.Hijos[indice] != null)
             {
                 var nn      = Nuevo.ToString();
                 var nodoact = Actual.Hijos[indice];
                 var note    = RetornaBuscar(nn, ref nodoact);
                 var notee   = note.ToString();
                 return(notee);
             }
         }
     }
     return(null);
 }
コード例 #10
0
        public int IndiceHijo(Bebida Nuevo, NodoB Actual)
        {
            var ListaConteo = new List <Bebida>();

            //Compara si no es la misma posicion

            if ((string.Compare(Nuevo.Nombre, Actual.Datos[0].Nombre)) == 0)
            {
                return(0);
            }

            foreach (var item in Actual.Datos)
            {
                if (item != null)
                {
                    ListaConteo.Add(item);
                }
            }
            var TotEle = ListaConteo.Count;

            if ((string.Compare(Nuevo.Nombre, Actual.Datos[TotEle - 1].Nombre)) == 1)
            {
                return(TotEle);
            }

            for (int i = 0; i < Actual.Datos.Length - 1; i++)
            {
                var izq = string.Compare(Nuevo.Nombre, Actual.Datos[i].Nombre);
                var der = string.Compare(Nuevo.Nombre, Actual.Datos[i].Nombre);
                if (izq != 1)
                {
                    return(i);
                }
                else if (der != 1)
                {
                    return(i + 1);
                }
            }
            return(99);

            //suma contador para ver posicion

            #region comments
            //for (int i = 0; i < Actual.Grado; i++)
            //{
            //    //if (String.Compare(Nuevo.Nombre, Actual.Datos[i].Nombre))
            //    //{

            //    //}
            //    //else if (true)
            //    //{

            //    //}
            //    //else if (true)
            //    //{

            //    //}
            //}

            #endregion
        }
コード例 #11
0
        public void PartirHijo(ref NodoB Actual, ref NodoB Padre, Bebida Nuevo)
        {
            var conta = 0;

            foreach (var item in Padre.Datos)
            {
                //No encuentra lugar en el padre, entonces se parte la raiz
                if (conta == Padre.Datos.Length)
                {
                }
            }


            var ArregloOrdenado = new Bebida[Actual.Grado];

            for (int i = 0; i < Actual.Datos.Length; i++)
            {
                ArregloOrdenado[i] = Actual.Datos[i];
            }
            ArregloOrdenado[ArregloOrdenado.Length - 1] = Nuevo;
            SortDatos(ref ArregloOrdenado);
            var Sube = ArregloOrdenado[(ArregloOrdenado.Length / 2)];
            //asignamos padre a los nuevos
            var Ladoizquierdo = new NodoB(Padre.Grado)
            {
                Padre = Padre
            };
            var LadoDerecho = new NodoB(Padre.Grado)
            {
                Padre = Padre
            };
            var indice = 0;

            for (int i = 0; i < (ArregloOrdenado.Length / 2); i++)
            {
                Ladoizquierdo.Datos[i] = ArregloOrdenado[indice];
                indice++;
            }
            indice++;
            for (int i = 0; i < (ArregloOrdenado.Length / 2); i++)
            {
                LadoDerecho.Datos[i] = ArregloOrdenado[indice];
                indice++;
            }
            //---------------------------------PROBANDO---------------------------
            var auxHijosParaMover = new NodoB[Padre.Grado];
            var indice_asignar    = 0;

            //desde el primero hasta el que toca partir
            for (int i = 0; i < Singleton.Instance.IndiceHijoActual; i++)
            {
                auxHijosParaMover[i] = Padre.Hijos[i];
                indice_asignar       = i;
            }
            //asignar los que se van a partir
            if (Singleton.Instance.IndiceHijoActual > 0)
            {
                indice_asignar++;
            }

            auxHijosParaMover[indice_asignar] = Ladoizquierdo;
            indice_asignar++;
            auxHijosParaMover[indice_asignar] = LadoDerecho;
            indice_asignar++;

            //asignar a partir de los nuevos a los derechos sobrantes
            for (int i = indice_asignar; i < Padre.Hijos.Length; i++)
            {
                auxHijosParaMover[i] = Padre.Hijos[i - 1];
            }

            Padre.Hijos = auxHijosParaMover;

            //reordenar Raiz
            var auxpadre = new List <Bebida>();

            foreach (var item in Padre.Datos)
            {
                if (item != null)
                {
                    auxpadre.Add(item);
                }
            }
            auxpadre.Add(Sube);
            auxpadre = auxpadre.OrderBy(o => o.Nombre).ToList();
            var y = 0;

            //sube dato al padre
            foreach (var item in auxpadre)
            {
                //No encuentra lugar en el padre, entonces se parte la raiz
                Padre.Datos[y] = item;
                y++;
            }
        }
コード例 #12
0
        public void Segunda(ref Bebida Nuevo)
        {
            #region Partiedo Hijos
            var ArregloHijosAAsignar       = new NodoB[Singleton.Instance.Raiz.Grado + 1];
            var ArregloDatosHijoQueSePArte = new Bebida[Singleton.Instance.Raiz.Grado];

            var hijosapartir         = Singleton.Instance.Raiz.Hijos[Singleton.Instance.IndiceHijoActual];
            var HijoPardidoIzquierda = new NodoB(Singleton.Instance.Raiz.Grado);
            var HijoPardidoDerecha   = new NodoB(Singleton.Instance.Raiz.Grado);
            var contador             = 0;

            for (int i = 0; i < Singleton.Instance.IndiceHijoActual; i++)
            {
                ArregloHijosAAsignar[i] = Singleton.Instance.Raiz.Hijos[i];
            }
            for (int i = Singleton.Instance.IndiceHijoActual + 1; i < Singleton.Instance.Raiz.Grado; i++)
            {
                ArregloHijosAAsignar[i + 1] = Singleton.Instance.Raiz.Hijos[i];
            }
            //Llenando hijo izquierdo
            contador = 0;
            foreach (var item in hijosapartir.Datos)
            {
                ArregloDatosHijoQueSePArte[contador] = hijosapartir.Datos[contador];
                contador++;
            }
            ArregloDatosHijoQueSePArte[contador] = Nuevo;
            SortDatos(ref ArregloDatosHijoQueSePArte);
            contador = 0;
            for (int i = 0; i < ArregloDatosHijoQueSePArte.Length / 2; i++)
            {
                HijoPardidoIzquierda.Datos[contador] = ArregloDatosHijoQueSePArte[i];
                contador++;
            }
            contador = 0;
            for (int i = (ArregloDatosHijoQueSePArte.Length / 2) + 1; i < ArregloDatosHijoQueSePArte.Length; i++)
            {
                HijoPardidoDerecha.Datos[contador] = ArregloDatosHijoQueSePArte[i];
                contador++;
            }

            contador = 0;
            foreach (var item in ArregloHijosAAsignar)
            {
                if (item == null)
                {
                    ArregloHijosAAsignar[contador] = HijoPardidoIzquierda; contador++;
                    break;
                }
                contador++;
            }

            //Asginando hijo derecho
            ArregloHijosAAsignar[contador] = HijoPardidoDerecha;


            #endregion
            //partir Raiz
            #region Partiendo Raiz Actual

            var ArregloRai_A_Asignar        = new NodoB[Singleton.Instance.Raiz.Grado + 1];
            var ArregloDatosPadreQueSePArte = new Bebida[Singleton.Instance.Raiz.Grado];
            var PadreIzquierdo = new NodoB(Singleton.Instance.Raiz.Grado);
            var PadreDerecho   = new NodoB(Singleton.Instance.Raiz.Grado);
            var arregloRaiz    = new Bebida[Singleton.Instance.Raiz.Grado];
            contador = 0;
            foreach (var item in Singleton.Instance.Raiz.Datos)
            {
                arregloRaiz[contador] = Singleton.Instance.Raiz.Datos[contador];
                contador++;
            }
            arregloRaiz[contador] = ArregloDatosHijoQueSePArte[ArregloDatosHijoQueSePArte.Length / 2];

            SortDatos(ref arregloRaiz);
            contador = 0;
            for (int i = 0; i < arregloRaiz.Length / 2; i++)
            {
                PadreIzquierdo.Datos[contador] = arregloRaiz[i];
                contador++;
            }
            contador = 0;
            for (int i = (arregloRaiz.Length / 2) + 1; i < arregloRaiz.Length; i++)
            {
                PadreDerecho.Datos[contador] = arregloRaiz[i];
                contador++;
            }
            var NuevaRaiz = new NodoB(Singleton.Instance.Raiz.Grado);
            NuevaRaiz.Datos[0]   = arregloRaiz[arregloRaiz.Length / 2];
            PadreDerecho.Padre   = NuevaRaiz;
            PadreIzquierdo.Padre = NuevaRaiz;
            // Subir mitad de raiz
            NuevaRaiz.Datos[0]   = arregloRaiz[arregloRaiz.Length / 2];
            PadreIzquierdo.Padre = NuevaRaiz;
            PadreDerecho.Padre   = NuevaRaiz;
            contador             = 0;
            for (int i = 0; i < ArregloHijosAAsignar.Length / 2; i++)
            {
                PadreIzquierdo.Hijos[i] = ArregloHijosAAsignar[contador];
                ArregloHijosAAsignar[contador].Padre = PadreIzquierdo;
                contador++;
            }
            for (int i = 0; i < ArregloHijosAAsignar.Length / 2; i++)
            {
                PadreDerecho.Hijos[i] = ArregloHijosAAsignar[contador];
                ArregloHijosAAsignar[contador].Padre = PadreDerecho;
                contador++;
            }
            #endregion
            //asignar padres
            NuevaRaiz.Hijos[0]             = PadreIzquierdo;
            NuevaRaiz.Hijos[1]             = PadreDerecho;
            Singleton.Instance.Raiz        = NuevaRaiz;
            Singleton.Instance.TercerNivel = true;
        }