Пример #1
0
 public void insertEntreNivelCol(ref Nodo actual, ref Nodo nuevo)
 {
     if (nuevo.unidad.nivel != actual.unidad.nivel && nuevo.unidad.nivel < 4 && nuevo.unidad.nivel >= 0)
     {
         if (nuevo.unidad.nivel < actual.unidad.nivel)
         {
             Nodo tmp = actual;
             if (tmp.abajo != null)
             {
                 if (nuevo.unidad.nivel == tmp.abajo.unidad.nivel)
                 {
                     nuevo.abajo      = tmp.abajo;
                     tmp.abajo.arriba = nuevo;
                     tmp.abajo        = null;
                 }
                 else if (tmp.abajo.atras != null)
                 {
                     Nodo tmpDer = tmp.abajo;
                     while (tmpDer != null)
                     {
                         if (tmpDer.unidad.nivel == nuevo.unidad.nivel)
                         {
                             tmpDer.arriba = nuevo;
                             nuevo.abajo   = tmpDer;
                             break;
                         }
                         tmpDer = tmpDer.atras;
                     }
                 }
                 else
                 {
                     nuevo.abajo      = tmp.abajo;
                     tmp.abajo.arriba = nuevo;
                     tmp.abajo        = null;
                 }
             }
             if (tmp.arriba != null)
             {
                 if (nuevo.unidad.nivel == tmp.arriba.unidad.nivel)
                 {
                     nuevo.arriba     = tmp.arriba;
                     tmp.arriba.abajo = nuevo;
                     tmp.arriba       = null;
                 }
                 else if (tmp.arriba.atras != null)
                 {
                     Nodo tmpIzq = tmp.arriba;
                     while (tmpIzq != null)
                     {
                         if (tmpIzq.unidad.nivel == nuevo.unidad.nivel)
                         {
                             tmpIzq.abajo = nuevo;
                             nuevo.arriba = tmpIzq;
                             break;
                         }
                         tmpIzq = tmpIzq.atras;
                     }
                 }
                 else
                 {
                     nuevo.arriba     = tmp.arriba;
                     tmp.arriba.abajo = nuevo;
                     tmp.arriba       = null;
                     verificarEnlaceCol(ref tmp, ref nuevo);
                 }
             }
         }
         else if (nuevo.unidad.nivel > actual.unidad.nivel)
         {
             Nodo tmp = actual;
             if (tmp.abajo != null)
             {
                 if (nuevo.unidad.nivel == tmp.abajo.unidad.nivel)
                 {
                     nuevo.abajo      = tmp.abajo;
                     tmp.abajo.arriba = nuevo;
                     tmp.abajo        = null;
                 }
                 else if (tmp.abajo.adelante != null)
                 {
                     Nodo tmpDer = tmp.abajo;
                     while (tmpDer != null)
                     {
                         if (tmpDer.unidad.nivel == nuevo.unidad.nivel)
                         {
                             tmpDer.arriba = nuevo;
                             nuevo.abajo   = tmpDer;
                             break;
                         }
                         tmpDer = tmpDer.adelante;
                     }
                 }
                 else
                 {
                     nuevo.abajo      = tmp.abajo;
                     tmp.abajo.arriba = nuevo;
                     tmp.abajo        = null;
                 }
             }
             if (tmp.arriba != null)
             {
                 if (nuevo.unidad.nivel == tmp.arriba.unidad.nivel)
                 {
                     nuevo.arriba     = tmp.arriba;
                     tmp.arriba.abajo = nuevo;
                     tmp.arriba       = null;
                 }
                 else if (tmp.arriba.adelante != null)
                 {
                     Nodo tmpIzq = tmp.arriba;
                     while (tmpIzq != null)
                     {
                         if (tmpIzq.unidad.nivel == nuevo.unidad.nivel)
                         {
                             tmpIzq.abajo = nuevo;
                             nuevo.arriba = tmpIzq;
                             break;
                         }
                         tmpIzq = tmpIzq.adelante;
                     }
                 }
                 else
                 {
                     nuevo.arriba     = tmp.arriba;
                     tmp.arriba.abajo = nuevo;
                     tmp.arriba       = null;
                 }
             }
         }
     }
 }
Пример #2
0
        public void insertEntreNivel(ref Nodo actual, ref Nodo nuevo)
        {
            if (nuevo.unidad.nivel != actual.unidad.nivel && nuevo.unidad.nivel < 4 && nuevo.unidad.nivel >= 0)
            {
                if (nuevo.unidad.nivel < actual.unidad.nivel)
                {
                    Nodo tmp    = actual;
                    bool enlazo = false;
                    while (tmp.atras != null)
                    {
                        if (tmp.atras.unidad.nivel < nuevo.unidad.nivel) //esta en medio de los nivees
                        {
                            nuevo.atras        = tmp.atras;
                            tmp.atras.adelante = nuevo;
                            tmp.atras          = nuevo;
                            nuevo.adelante     = tmp;
                            enlazo             = true;
                            break;
                        }
                        tmp = tmp.atras;
                    }
                    if (tmp.atras == null)
                    {
                        tmp.atras      = nuevo;
                        nuevo.adelante = tmp;
                        enlazo         = true;
                    }

                    if (enlazo)
                    {
                        if (tmp.derecha != null)
                        {
                            if (nuevo.unidad.nivel == tmp.derecha.unidad.nivel)
                            {
                                nuevo.derecha         = tmp.derecha;
                                tmp.derecha.izquierda = nuevo;
                                tmp.derecha           = null;
                            }
                            else if (tmp.derecha.atras != null)
                            {
                                Nodo tmpDer = tmp.derecha;
                                while (tmpDer != null)
                                {
                                    if (tmpDer.unidad.nivel == nuevo.unidad.nivel)
                                    {
                                        tmpDer.izquierda = nuevo;
                                        nuevo.derecha    = tmpDer;
                                        break;
                                    }
                                    tmpDer = tmpDer.atras;
                                }
                            }
                            else
                            {
                                nuevo.derecha         = tmp.derecha;
                                tmp.derecha.izquierda = nuevo;
                                tmp.derecha           = null;
                                //verificarEnlaceFila(ref actual, ref nuevo);
                            }
                        }
                        if (tmp.izquierda != null)
                        {
                            if (nuevo.unidad.nivel == tmp.izquierda.unidad.nivel)
                            {
                                nuevo.izquierda       = tmp.izquierda;
                                tmp.izquierda.derecha = nuevo;
                                tmp.izquierda         = null;
                            }
                            else if (tmp.izquierda.atras != null)
                            {
                                Nodo tmpIzq = tmp.izquierda;
                                while (tmpIzq != null)
                                {
                                    if (tmpIzq.unidad.nivel == nuevo.unidad.nivel)
                                    {
                                        tmpIzq.derecha  = nuevo;
                                        nuevo.izquierda = tmpIzq;
                                        break;
                                    }
                                    tmpIzq = tmpIzq.atras;
                                }
                            }
                            else
                            {
                                nuevo.izquierda       = tmp.izquierda;
                                tmp.izquierda.derecha = nuevo;
                                tmp.izquierda         = null;
                            }
                        }
                    }
                }
                else if (nuevo.unidad.nivel > actual.unidad.nivel)
                {
                    Nodo tmp    = actual;
                    bool enlazo = false;

                    while (tmp.adelante != null)
                    {
                        if (nuevo.unidad.nivel < tmp.adelante.unidad.nivel) //esta en medio de los nivees
                        {
                            nuevo.adelante     = tmp.adelante;
                            tmp.adelante.atras = nuevo;
                            tmp.adelante       = nuevo;
                            nuevo.atras        = tmp;
                            enlazo             = true;
                            break;
                        }
                        tmp = tmp.adelante;
                    }

                    if (tmp.adelante == null)
                    {
                        tmp.adelante = nuevo;
                        nuevo.atras  = tmp;
                        enlazo       = true;
                    }

                    if (enlazo)
                    {
                        if (tmp.derecha != null)
                        {
                        }
                    }


                    if (enlazo)
                    {
                        if (tmp.derecha != null)
                        {
                            if (nuevo.unidad.nivel == tmp.derecha.unidad.nivel)
                            {
                                nuevo.derecha         = tmp.derecha;
                                tmp.derecha.izquierda = nuevo;
                                tmp.derecha           = null;
                            }
                            else if (tmp.derecha.adelante != null)
                            {
                                Nodo tmpDer = tmp.derecha;
                                while (tmpDer != null)
                                {
                                    if (tmpDer.unidad.nivel == nuevo.unidad.nivel)
                                    {
                                        tmpDer.izquierda = nuevo;
                                        nuevo.derecha    = tmpDer;
                                        break;
                                    }
                                    tmpDer = tmpDer.adelante;
                                }
                            }
                            else
                            {
                                nuevo.derecha         = tmp.derecha;
                                tmp.derecha.izquierda = nuevo;
                                tmp.derecha           = null;
                            }
                        }
                        if (tmp.izquierda != null)
                        {
                            if (nuevo.unidad.nivel == tmp.izquierda.unidad.nivel)
                            {
                                nuevo.izquierda       = tmp.izquierda;
                                tmp.izquierda.derecha = nuevo;
                                tmp.izquierda         = null;
                            }
                            else if (tmp.izquierda.adelante != null)
                            {
                                Nodo tmpIzq = tmp.izquierda;
                                while (tmpIzq != null)
                                {
                                    if (tmpIzq.unidad.nivel == nuevo.unidad.nivel)
                                    {
                                        tmpIzq.derecha  = nuevo;
                                        nuevo.izquierda = tmpIzq;
                                        break;
                                    }
                                    tmpIzq = tmpIzq.adelante;
                                }
                            }
                            else
                            {
                                nuevo.izquierda       = tmp.izquierda;
                                tmp.izquierda.derecha = nuevo;
                                tmp.izquierda         = null;
                            }
                        }
                    }
                }
            }
        }
Пример #3
0
        public void verificarEnlaceIzqDer(ref Nodo actual, ref Nodo nuevo)
        {
            //un cero recorro atras del cubo y un 1 recorro adelante del cubo  y un 2 estan en el mismo nivel
            int lado = verificarLadoNivel(ref actual, ref nuevo);

            if (actual.izquierda != null)
            {
                Nodo tmpIzq = actual.izquierda;
                while (tmpIzq != null)
                {
                    if (lado == 1)    //tengo que moverme hacia adelante
                    {
                        if (tmpIzq.adelante != null)
                        {
                            Nodo tmpIzqAdelante = tmpIzq;
                            while (tmpIzqAdelante != null)
                            {
                                if (tmpIzqAdelante.unidad.nivel == nuevo.unidad.nivel)
                                {
                                    tmpIzqAdelante.derecha = nuevo;
                                    nuevo.izquierda        = tmpIzqAdelante;
                                    break;
                                }
                                tmpIzqAdelante = tmpIzqAdelante.adelante;
                            }
                            break;
                        }
                    }
                    else if (lado == 0)   //tengo que moverme hacia abajo
                    {
                        if (tmpIzq.atras != null)
                        {
                            Nodo tmpIzqAtras = tmpIzq;
                            while (tmpIzqAtras != null)
                            {
                                if (tmpIzqAtras.unidad.nivel == nuevo.unidad.nivel)
                                {
                                    tmpIzqAtras.derecha = nuevo;
                                    nuevo.izquierda     = tmpIzqAtras;
                                    break;
                                }
                                tmpIzqAtras = tmpIzqAtras.atras;
                            }
                            break;
                        }
                    }
                    tmpIzq = tmpIzq.izquierda;
                }
            }

            if (actual.derecha != null)
            {
                Nodo tmpDer = actual.derecha;
                while (tmpDer != null)
                {
                    if (lado == 1) //tengo que movereme hacia adelante
                    {
                        if (tmpDer.adelante != null)
                        {
                            Nodo tmpDerAdelante = tmpDer;
                            while (tmpDerAdelante != null)
                            {
                                if (tmpDerAdelante.unidad.nivel == nuevo.unidad.nivel)
                                {
                                    tmpDerAdelante.izquierda = nuevo;
                                    nuevo.derecha            = tmpDerAdelante;
                                    break;
                                }
                                tmpDerAdelante = tmpDerAdelante.adelante;
                            }
                            break;
                        }
                    }
                    else if (lado == 0) //tengoq ue moverme hacia atras
                    {
                        if (tmpDer.atras != null)
                        {
                            Nodo tmpDerAtras = tmpDer;
                            while (tmpDerAtras != null)
                            {
                                if (tmpDerAtras.unidad.nivel == nuevo.unidad.nivel)
                                {
                                    tmpDerAtras.izquierda = nuevo;
                                    nuevo.derecha         = tmpDerAtras;
                                    break;
                                }
                                tmpDerAtras = tmpDerAtras.atras;
                            }
                            break;
                        }
                    }
                    tmpDer = tmpDer.derecha;
                }
            }
        }
Пример #4
0
        public void verificarEnlaceIzqDerNiveles(ref Nodo actual, ref Nodo nuevo)
        {
            //un cero recorro atras del cubo y un 1 recorro adelante del cubo  y un 2 estan en el mismo nivel
            int lado = verificarLadoNivel(ref actual, ref nuevo);

            if (lado == 2) //significa que hay que verificar los adelante del actual
            {
                if (actual.adelante != null)
                {
                    verificarEnlaceIzqDerNiveles(ref actual.adelante, ref nuevo); //metodo recursivo solo que cambia el nivel hacia adelante
                }
                if (actual.atras != null)
                {
                    verificarEnlaceIzqDerNiveles(ref actual.atras, ref nuevo); //metodo recursivo solo que cambia el nivel hacia atras
                }
            }
            else
            {
                if (actual.izquierda != null)
                {
                    Nodo tmpIzq = actual;
                    while (tmpIzq != null)
                    {
                        if (lado == 1)
                        {
                            if (tmpIzq.columna == nuevo.columna && !verificarNiveles(ref tmpIzq, ref nuevo))
                            {
                                Nodo tmpIzqAdelante = tmpIzq;
                                while (tmpIzqAdelante.adelante != null)
                                {
                                    if (nuevo.unidad.nivel < tmpIzqAdelante.adelante.unidad.nivel)
                                    {
                                        nuevo.adelante = tmpIzqAdelante.adelante;
                                        tmpIzqAdelante.adelante.atras = nuevo;
                                        tmpIzqAdelante.adelante       = nuevo;
                                        nuevo.atras = tmpIzqAdelante;
                                        break;
                                    }
                                    tmpIzqAdelante = tmpIzqAdelante.adelante;
                                }
                                if (tmpIzqAdelante.adelante == null)
                                {
                                    tmpIzqAdelante.adelante = nuevo;
                                    nuevo.atras             = tmpIzqAdelante;
                                }

                                break;
                            }
                        }
                        else if (lado == 0)
                        {
                            if (tmpIzq.columna == nuevo.columna && !verificarNiveles(ref tmpIzq, ref nuevo))
                            {
                                Nodo tmpIzqAtras = tmpIzq;

                                while (tmpIzqAtras.atras != null)
                                {
                                    if (nuevo.unidad.nivel > tmpIzqAtras.atras.unidad.nivel)
                                    {
                                        nuevo.atras = tmpIzqAtras.atras;
                                        tmpIzqAtras.atras.adelante = nuevo;
                                        tmpIzqAtras.atras          = nuevo;
                                        nuevo.adelante             = tmpIzqAtras;
                                        break;
                                    }

                                    tmpIzqAtras = tmpIzqAtras.atras;
                                }
                                if (tmpIzqAtras.atras == null)
                                {
                                    tmpIzqAtras.atras = nuevo;
                                    nuevo.adelante    = tmpIzqAtras;
                                }
                                break;
                            }
                        }
                        tmpIzq = tmpIzq.izquierda;
                    }
                }

                if (actual.derecha != null)
                {
                    Nodo tmpDer = actual;
                    while (tmpDer != null)
                    {
                        if (lado == 1)
                        {
                            if (tmpDer.columna == nuevo.columna && !verificarNiveles(ref tmpDer, ref nuevo))
                            {
                                Nodo tmpDerAdelante = tmpDer;
                                while (tmpDerAdelante.adelante != null)
                                {
                                    if (nuevo.unidad.nivel < tmpDerAdelante.adelante.unidad.nivel)
                                    {
                                        nuevo.adelante = tmpDerAdelante.adelante;
                                        tmpDerAdelante.adelante.atras = nuevo;
                                        tmpDerAdelante.adelante       = nuevo;
                                        nuevo.atras = tmpDerAdelante;
                                        break;
                                    }
                                    tmpDerAdelante = tmpDerAdelante.adelante;
                                }
                                if (tmpDerAdelante.adelante == null)
                                {
                                    tmpDerAdelante.adelante = nuevo;
                                    nuevo.atras             = tmpDerAdelante;
                                    break;
                                }
                            }
                        }
                        else if (lado == 0)
                        {
                            if (tmpDer.columna == nuevo.columna && !verificarNiveles(ref tmpDer, ref nuevo))
                            {
                                Nodo tmpDerAtras = tmpDer;
                                while (tmpDerAtras.atras != null)
                                {
                                    if (nuevo.unidad.nivel > tmpDerAtras.atras.unidad.nivel)
                                    {
                                        nuevo.atras = tmpDerAtras.atras;
                                        tmpDerAtras.atras.adelante = nuevo;
                                        nuevo.adelante             = tmpDerAtras;
                                        tmpDerAtras.atras          = nuevo;
                                        break;
                                    }

                                    tmpDerAtras = tmpDerAtras.atras;
                                }

                                if (tmpDerAtras.atras == null)
                                {
                                    tmpDerAtras.atras = nuevo;
                                    nuevo.adelante    = tmpDerAtras;
                                    break;
                                }
                            }
                        }
                        tmpDer = tmpDer.derecha;
                    }
                }
            }
        }
Пример #5
0
        public void insertar(int fila, string columna, ref Unidad nuevaUnidad)
        {
            int        col            = Encoding.ASCII.GetBytes(columna)[0]; //conversion de stirng a entero en codigo ascii
            Nodo       nuevoNodo      = new Nodo(fila, col, ref nuevaUnidad);
            Encabezado encabezadoFila = ncbzdoFilas.buscarEncabezado(fila);

            if (encabezadoFila == null)
            {
                encabezadoFila = new Encabezado(fila);
                ncbzdoFilas.insertar(ref encabezadoFila);
                encabezadoFila.acceso = nuevoNodo;
            }
            else
            {                                                          /* El nuevo nodo pregunta si la columna  es menor a la que tiene acceso la fila
                                                                        * Esta Verificado que no importa que nivel se inserte al principio */
                if (nuevoNodo.columna < encabezadoFila.acceso.columna) //insercion al inicio
                {
                    nuevoNodo.derecha = encabezadoFila.acceso;
                    encabezadoFila.acceso.izquierda = nuevoNodo;
                    encabezadoFila.acceso           = nuevoNodo;
                }
                else
                {
                    /* Hay que preguntar si el nivel del nuevo Nodo existe en la Fila Obtenida
                     * Si retorna un Null hay que ubicarlo en los Niveles de la Fila
                     * si retorn distinto a Null hay que ubicarlo en las columnas del  Nodo ubicado*/
                    Nodo NodoEncontrado = existeNivel(ref encabezadoFila.acceso, nuevoNodo.unidad.nivel);
                    if (NodoEncontrado == null)                                 //hay que hubicarlo en los niveles de la Fila
                    {
                        if (nuevoNodo.columna == encabezadoFila.acceso.columna) //tengo que verificar si el nuevo tiene la misma columna
                        {
                            insertarEntreNiveles(ref encabezadoFila.acceso, ref nuevoNodo);
                            verificarEnlaceIzqDer(ref encabezadoFila.acceso, ref nuevoNodo);
                            if (nuevoNodo.unidad.nivel == 1) //si el nuevoNod en la misma columna tiene nivel 1 lo pongo como acceso
                            {
                                encabezadoFila.acceso = nuevoNodo;
                            }
                            else if (nuevoNodo.unidad.nivel != 1)
                            {
                                if (nuevoNodo.unidad.nivel < encabezadoFila.acceso.unidad.nivel)
                                {
                                    encabezadoFila.acceso = nuevoNodo;
                                }
                            }
                        }
                        else //significa el nivel no esxite y que las columnas no son las mismas
                        {
                            insertarEntreNiveles(ref encabezadoFila.acceso, ref nuevoNodo);
                            verificarEnlaceIzqDerNiveles(ref encabezadoFila.acceso, ref nuevoNodo);
                        }
                    }
                    // el nivel del nuevo nodo ya existe por lo tanto con lo retornado hay que hubicarlos entre sus columnas
                    // preguntando siempre si el nuevo columna tiene distita columna que el nodo Encontrado ya que es el acceso
                    else if (!existeNodoFila(ref NodoEncontrado, ref nuevoNodo))
                    {
                        if (nuevoNodo.columna < NodoEncontrado.columna) // insercion al inicio
                        {
                            int ladoNivel = verificarLadoNivel(ref encabezadoFila.acceso, ref nuevoNodo);
                            NodoEncontrado.izquierda = nuevoNodo;
                            nuevoNodo.derecha        = NodoEncontrado;

                            if (ladoNivel == 1)
                            {
                                encabezadoFila.acceso.adelante.atras = null; // borro el enlace que quedaba de por medio
                                encabezadoFila.acceso.adelante       = nuevoNodo;
                                nuevoNodo.atras = encabezadoFila.acceso;
                            }
                            else if (ladoNivel == 0)
                            {
                                encabezadoFila.acceso.atras.adelante = null; //borro elenlace que quedaba de por medio
                                encabezadoFila.acceso.atras          = nuevoNodo;
                                nuevoNodo.adelante = encabezadoFila.acceso;
                            }
                            if (nuevoNodo.unidad.nivel == 1)
                            {
                                encabezadoFila.acceso = nuevoNodo;
                            }
                        }
                        else
                        {
                            Nodo tmpNivel = NodoEncontrado;
                            while (tmpNivel.derecha != null)
                            {
                                if (nuevoNodo.columna < tmpNivel.derecha.columna) //insercion al medio
                                {
                                    nuevoNodo.derecha          = tmpNivel.derecha;
                                    tmpNivel.derecha.izquierda = nuevoNodo;
                                    nuevoNodo.izquierda        = tmpNivel;
                                    tmpNivel.derecha           = nuevoNodo;
                                    verificarEnlaceIzqDerNiveles(ref tmpNivel, ref nuevoNodo);
                                    break;
                                }
                                tmpNivel = tmpNivel.derecha;
                            }
                            if (tmpNivel.derecha == null)
                            {
                                tmpNivel.derecha    = nuevoNodo;
                                nuevoNodo.izquierda = tmpNivel;
                                verificarEnlaceIzqDerNiveles(ref tmpNivel, ref nuevoNodo);
                            }
                        }
                    }
                }
            }
/*----------------------------- COMIENZA EL ANALISIS EN LA INSERCION DE COLUMNAS --------------------------*/
            Encabezado encabezadoCol = ncbzdoColumnas.buscarEncabezado(col);

            if (encabezadoCol == null)
            {
                encabezadoCol = new Encabezado(col);
                ncbzdoColumnas.insertar(ref encabezadoCol);
                encabezadoCol.acceso = nuevoNodo;
            }
        }