Beispiel #1
0
        public void Insertar(Bebida Nuevo)
        {
            var FILE   = new FileStream(GlobalPath, FileMode.Open);
            var lector = new StreamReader(FILE);

            if (IdPAdre == 1 && !primeraSeparecion) // aun no se parte
            {
                var linea = lector.ReadLine();
                linea = lector.ReadLine();
                FILE.Close();
                Raiz = Raiz.ReadNodo(linea);
                var contador = 0;
                for (int i = 0; i <= Raiz.Datos.Length; i++)
                {
                    if (i == Raiz.Datos.Length)
                    {
                        PrimeraSeparacion(Raiz, Nuevo);
                        break;
                    }
                    //insertando en la raiz
                    if (Raiz.Datos[i] == null)
                    {
                        Raiz.Datos[contador] = Nuevo;
                        SortDatos(Raiz.Datos);

                        var escritor = new StreamWriter(GlobalPath);
                        escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" +
                                           $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" +
                                           $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}");
                        escritor.WriteLine(Raiz.WriteNodo());
                        escritor.Close();
                        break;
                    }
                    else
                    {
                        contador++;
                    }
                }
            }
            else
            {
                FILE.Close();
                InsertarEnHoja(SeekPadre(IdPAdre), Nuevo);
            }
        }
Beispiel #2
0
 public NodoStar(int _grado, bool Tipo)
 {
     if (Tipo)
     {//si es hoja
         Datos  = new Bebida[_grado - 1];
         Hijos  = new int[_grado];
         esHoja = Tipo;
         Grado  = _grado;
     }
     else
     { // es la raix
         Grado = _grado;
         var GradRaiz = Convert.ToInt32(1.33333 * (double)(_grado - 1));
         Datos  = new Bebida[GradRaiz];
         Hijos  = new int[GradRaiz + 1];
         esHoja = Tipo;
     }
 }
Beispiel #3
0
        public void PartirHaciaLaDerecha(NodoStar Hijo, NodoStar Hermano, Bebida Nuevo)
        {
            var padre        = SeekPadre(Hijo.Padre);
            var NuevoHermano = new NodoStar(Grado, true)
            {
                Padre = Hijo.Padre,
                id    = Siguiente
            };

            Siguiente++;
            var lista = new List <Bebida>();

            //llenamos la lista
            foreach (var item in padre.Datos)
            {
                if (item == null)
                {
                    break;
                }
                else
                {
                    lista.Add(item);
                }
            }
            foreach (var item in Hijo.Datos)
            {
                if (item == null)
                {
                    break;
                }
                else
                {
                    lista.Add(item);
                }
            }
            foreach (var item in Hermano.Datos)
            {
                if (item == null)
                {
                    break;
                }
                else
                {
                    lista.Add(item);
                }
            }
            lista.Add(Nuevo);
            var array = lista.ToArray();

            SortDatos(array);
            lista = array.ToList <Bebida>();
            var minimo       = ((2 * Grado) - 1) / 3;
            var listaPadre   = new List <Bebida>();
            var listaHijo    = new List <Bebida>();
            var listaHermano = new List <Bebida>();
            var listaNuevo   = new List <Bebida>();

            for (int i = 0; i < minimo; i++)
            {
                listaHijo.Add(lista[0]);
                lista.Remove(lista[0]);
            }
            listaPadre.Add(lista[0]);
            lista.Remove(lista[0]);
            for (int i = 0; i < minimo; i++)
            {
                listaHermano.Add(lista[0]);
                lista.Remove(lista[0]);
            }
            listaPadre.Add(lista[0]);
            lista.Remove(lista[0]);
            for (int i = 0; i < minimo; i++)
            {
                listaNuevo.Add(lista[0]);
                lista.Remove(lista[0]);
            }
            for (int i = 0; i < Hijo.Datos.Length; i++)
            {
                if (listaHijo.Count != 0)
                {
                    Hijo.Datos[i] = listaHijo[0]; listaHijo.Remove(listaHijo[0]);
                }
                else
                {
                    Hijo.Datos[i] = null;
                }
            }
            for (int i = 0; i < Hermano.Datos.Length; i++)
            {
                if (listaHermano.Count != 0)
                {
                    Hermano.Datos[i] = listaHermano[0]; listaHermano.Remove(listaHermano[0]);
                }
                else
                {
                    Hermano.Datos[i] = null;
                }
            }
            for (int i = 0; i < NuevoHermano.Datos.Length; i++)
            {
                if (listaNuevo.Count != 0)
                {
                    NuevoHermano.Datos[i] = listaNuevo[0]; listaNuevo.Remove(listaNuevo[0]);
                }
                else
                {
                    NuevoHermano.Datos[i] = null;
                }
            }
            for (int i = 0; i < padre.Datos.Length; i++)
            {
                if (listaPadre.Count != 0)
                {
                    padre.Datos[i] = listaPadre[0]; listaPadre.Remove(listaPadre[0]);
                }
                else
                {
                    padre.Datos[i] = null;
                }
            }
            for (int i = 0; i < padre.Hijos.Length; i++)
            {
                if (padre.Hijos[i] == 0)
                {
                    padre.Hijos[i] = NuevoHermano.id;
                    break;
                }
            }
            EscribirMetaData();
            EscribirPadre(padre.id, padre);
            EscribirHijo(Hijo.id, Hijo);
            EscribirHijo(Hermano.id, Hermano);
            EscribirHijo(NuevoHermano.id, NuevoHermano);
        }
Beispiel #4
0
        public void CompartirDato(NodoStar Actual, Bebida Nuevo)
        {
            var padre                   = SeekPadre(Actual.Padre);
            var IndicesHijos            = new List <int>();
            var indiceDelHijoACompartir = 0;

            //llenar lista de hijos disponibles
            foreach (var indicehijo in padre.Hijos)
            {
                if (indicehijo == 0)
                {
                    break;
                }
                else
                {
                    IndicesHijos.Add(indicehijo);
                }
            }
            IndicesHijos.ToArray();
            // encuentra el indice en el arreglo de hijos
            foreach (var item in IndicesHijos)
            {
                if (item == Actual.id)
                {
                    break;
                }
                else
                {
                    indiceDelHijoACompartir++;
                }
            }
            // izquierda


            var indiceizquierda = indiceDelHijoACompartir - 1;
            var indiceDerecha   = indiceDelHijoACompartir + 1;
            var caminoDerecha   = new List <int>();
            var caminoIzquierda = new List <int>();
            var intercambiado   = true;

            if (indiceizquierda >= 0 && intercambiado)
            {
                var lool = IndicesHijos[indiceDerecha];
                if (!EstaLleno(SeekHijo(lool)))
                {
                    caminoIzquierda.Add(IndicesHijos[indiceizquierda]);

                    CompartirHaciaLaIzquierda(Actual, caminoIzquierda.ToArray(), Nuevo);
                    intercambiado = false;
                }
                else
                {
                    //Partir Hacia la derecha
                    PartirHaciaLaDerecha(Actual, SeekHijo(lool), Nuevo);
                }
            }

            if (indiceDerecha <= IndicesHijos.Count && intercambiado)
            {
                var lool = IndicesHijos[indiceDerecha];
                if (!EstaLleno(SeekHijo(lool)))
                {
                    caminoDerecha.Add(IndicesHijos[indiceDerecha]);

                    CompartirHaciaLaDerecha(Actual, caminoDerecha.ToArray(), Nuevo);
                }
                else
                {
                    //Partir Hacia la derecha
                    PartirHaciaLaDerecha(Actual, SeekHijo(lool), Nuevo);
                }
            }
        }
Beispiel #5
0
        public void PrimeraSeparacion(NodoStar Actual, Bebida Nuevo)
        {
            var lista = new List <Bebida>();

            foreach (var item in Actual.Datos)
            {
                lista.Add(item);
            }
            lista.Add(Nuevo);

            // escribir en el archivo todos los nodos disponibles del padre e hijos
            var hijo1 = new NodoStar(Grado, true)
            {
                Grado = Grado
            };

            hijo1.id = IdPAdre;
            var indice = 0;

            for (int i = 0; i < lista.Count / 2; i++)
            {
                hijo1.Datos[indice] = lista[i];
                indice++;
            }


            indice = 0;
            var hijo2 = new NodoStar(Grado, true);

            hijo2.id = Siguiente;
            Siguiente++;
            for (int i = (lista.Count / 2) + 1; i < lista.Count; i++)
            {
                hijo2.Datos[indice] = lista[i];
                indice++;
            }
            var raiznueva = new NodoStar(Grado, false)
            {
                id = Siguiente
            };

            lista.Sort((x, y) => x.Nombre.CompareTo(y.Nombre));
            raiznueva.Datos[0] = lista[(lista.Count / 2) + 1];
            IdPAdre            = Siguiente;
            raiznueva.Hijos[0] = hijo1.id;
            raiznueva.Hijos[1] = hijo2.id;
            hijo1.Padre        = raiznueva.id;
            hijo2.Padre        = raiznueva.id;
            Siguiente++;
            SortDatos(raiznueva.Datos);
            SortDatos(hijo1.Datos);
            SortDatos(hijo2.Datos);

            var escritor = new StreamWriter(GlobalPath);

            //metadata
            escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" +
                               $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" +
                               $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}|");
            // nodos
            escritor.WriteLine(hijo1.WriteNodo());
            escritor.WriteLine(hijo2.WriteNodo());
            escritor.WriteLine(raiznueva.WriteNodo());
            escritor.Close();
        }