internal void AgregarDato(string llave, T dato, int hijoDerecho, bool ValidarLleno) { if (Lleno && ValidarLleno) { throw new IndexOutOfRangeException("El nodo está lleno, ya no puede insertar más datos"); } if (llave == "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") { throw new ArgumentOutOfRangeException("llave"); } // Se ubica la posición para insertar, en el punto // donde se encuentre el primer registro mayor que la llave int posicionParaInsertar = 0; posicionParaInsertar = PosicionAproximadaEnNodo(llave); // Corrimiento de hijos for (int i = Hijos.Count - 1; i > posicionParaInsertar + 1; i--) { Hijos[i] = Hijos[i - 1]; } Hijos[posicionParaInsertar + 1] = hijoDerecho; // Corrimiento de llaves for (int i = Llaves.Count - 1; i > posicionParaInsertar; i--) { Llaves[i] = Llaves[i - 1]; Datos[i] = Datos[i - 1]; } Llaves[posicionParaInsertar] = Utilidades.FormatearLlave(llave); Datos[posicionParaInsertar] = dato; }
internal void SepararNodo(string llave, T dato, int hijoDerecho, NodoB <T> nuevoNodo, ref string llavePorSubir, ref T datoPorSubir) { if (!Lleno) { throw new Exception("Uno nodo solo puede separarse si está lleno"); } // Incrementar el tamaño de las listas en una posición Llaves.Add("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); Datos.Add(dato); Hijos.Add(Utilidades.ApuntadorVacio); // Agregar los nuevos elementos en orden AgregarDato(llave, dato, hijoDerecho, false); // Obtener los valores a subir int mitad = (Orden / 2); llavePorSubir = Utilidades.FormatearLlave(Llaves[mitad]); datoPorSubir = Datos[mitad]; Llaves[mitad] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Llenar las llaves y datos que pasan al nuevo nodo int j = 0; for (int i = mitad + 1; i < Llaves.Count; i++) { nuevoNodo.Llaves[j] = Llaves[i]; nuevoNodo.Datos[j] = Datos[i]; Llaves[i] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; j++; } // Llenar los hijos que pasan al nuevo nodo j = 0; for (int i = mitad + 1; i < Hijos.Count; i++) { nuevoNodo.Hijos[j] = Hijos[i]; Hijos[i] = Utilidades.ApuntadorVacio; j++; } Llaves.RemoveAt(Llaves.Count - 1); Datos.RemoveAt(Datos.Count - 1); Hijos.RemoveAt(Hijos.Count - 1); }
private string ConvertirATextoTamañoFijo() { StringBuilder datosCadena = new StringBuilder(); datosCadena.Append(Utilidades.FormatearEntero(Posicion)); datosCadena.Append(Utilidades.TextoSeparador); datosCadena.Append(Utilidades.FormatearEntero(Padre)); datosCadena.Append(Utilidades.TextoSeparador); datosCadena.Append(Utilidades.TextoSeparador); datosCadena.Append(Utilidades.TextoSeparador); for (int i = 0; i < Hijos.Count; i++) { datosCadena.Append(Utilidades.FormatearEntero(Hijos[i])); datosCadena.Append(Utilidades.TextoSeparador); } datosCadena.Append(Utilidades.TextoSeparador); datosCadena.Append(Utilidades.TextoSeparador); for (int i = 0; i < Llaves.Count; i++) { datosCadena.Append(Utilidades.FormatearLlave(Llaves[i])); datosCadena.Append(Utilidades.TextoSeparador); } datosCadena.Append(Utilidades.TextoSeparador); datosCadena.Append(Utilidades.TextoSeparador); for (int i = 0; i < Datos.Count; i++) { datosCadena.Append(Datos[i].ToFixedSizeString().Replace(Utilidades.TextoSeparador, Utilidades.TextoSustitutoSeparador)); datosCadena.Append(Utilidades.TextoSeparador); } datosCadena.Append(Utilidades.TextoNuevaLinea); return(datosCadena.ToString()); }