예제 #1
0
        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;
        }
예제 #2
0
        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);
        }
예제 #3
0
        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());
        }