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); } }
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; } }
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); }
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); } } }
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(); }