Пример #1
0
 public Encabezado(int id)
 {
     this.id        = id;
     this.siguiente = null;
     this.anterior  = null;
     this.acceso    = null;
 }
Пример #2
0
        public bool eliminar(int id)
        {
            if (primero != null)
            {
                if (primero.id == id)
                {
                    primero          = primero.siguiente;
                    primero.anterior = null;
                    size--;
                    return(true);
                }
                else
                {
                    Encabezado tmp = primero;

                    while (tmp != null)
                    {
                        if (id == tmp.id)
                        {
                            Encabezado tmp2 = tmp.anterior;
                            tmp2.siguiente         = tmp.siguiente;
                            tmp.siguiente.anterior = tmp2;
                            size--;
                            return(true);
                        }
                        tmp = tmp.siguiente;
                    }
                }
            }
            return(false);
        }
Пример #3
0
 public Encabezado buscarEncabezado(int id)
 {
     if (primero != null)
     {
         Encabezado tmp = primero;
         while (tmp != null)
         {
             if (tmp.id == id)
             {
                 return(tmp);
             }
             tmp = tmp.siguiente;
         }
     }
     return(null);
 }
Пример #4
0
        public void  enlazarNodosOrtoCol(ref Encabezado eActual, ref string acum, int nivel)
        {
            if (eActual.acceso != null)
            {
                string idCum     = "";
                string acumElace = "";
                Nodo   tmp       = eActual.acceso;

                if (tmp.unidad.nivel == nivel)
                {
                    acumElace += eActual.GetHashCode().ToString() + " -> " + tmp.GetHashCode().ToString() + ";\n";
                }


                while (tmp.abajo != null)
                {
                    if (tmp.unidad.nivel == nivel)
                    {
                        idCum += tmp.GetHashCode().ToString() + "[label=\"" + tmp.unidad.tipo.ToString() + "\"];\n";
                        if (tmp.abajo.unidad.nivel == nivel)
                        {
                            acumElace += tmp.GetHashCode().ToString() + " -> " + tmp.abajo.GetHashCode().ToString() + ";\n";
                        }
                    }
                    tmp = tmp.abajo;
                }


                if (tmp.unidad.nivel == nivel)
                {
                    idCum += tmp.GetHashCode().ToString() + "[label=\"" + tmp.unidad.tipo.ToString() + "\"];\n";
                }
/************************************************************************************************************/
                while (tmp.arriba != null)
                {
                    if (tmp.unidad.nivel == nivel && tmp.arriba.unidad.nivel == nivel)
                    {
                        acumElace += tmp.GetHashCode().ToString() + " -> " + tmp.arriba.GetHashCode().ToString() + ";\n";
                    }
                    tmp = tmp.arriba;
                }

                acum += idCum + acumElace + "\n";
            }
        }
Пример #5
0
        public void insertar(ref Encabezado nuevo)
        {
            if (primero == null)
            {
                primero = nuevo;
                size++;
            }
            else
            {
                if (nuevo.id < primero.id) //insercion al inicio
                {
                    nuevo.siguiente  = primero;
                    primero.anterior = nuevo;
                    primero          = nuevo;
                    size++;
                }
                else
                {
                    Encabezado tmp = primero;

                    while (tmp.siguiente != null)
                    {
                        if (nuevo.id < tmp.siguiente.id)
                        {
                            nuevo.siguiente        = tmp.siguiente;
                            tmp.siguiente.anterior = nuevo;
                            nuevo.anterior         = tmp;
                            tmp.siguiente          = nuevo;
                            size++;
                            break;
                        }
                        tmp = tmp.siguiente;
                    }

                    if (tmp.siguiente == null)
                    {
                        tmp.siguiente  = nuevo;
                        nuevo.anterior = tmp;
                        size++;
                    }
                }
            }
        }
Пример #6
0
 public Nodo buscarNodoCol(ref Encabezado eCol)
 {
     return(null);
 }
Пример #7
0
        public void generarMatriz(Matriz matriz, int nivel)
        {
            string acumInfo = "digraph G{ \n " +
                              "node[shape=box, style=filled, color=deepskyblue3];\n " +
                              "edge[color=black]; \n " +
                              "rankdir=UD; \n";


            string idCabeceraFila  = "";
            string cabeceraFila    = "";
            string idCabeceraCol   = "";
            string cabeceraCol     = "";
            string alineacionCol   = "{rank=min;Matriz;";
            string acumOrtogonales = "";

            string nodoAcum         = "";
            string anterior         = "";
            string anteriorCabecera = "";
            string filas            = "Matriz;";
            string columnas         = "Matriz";

            //recorrido de filas;
            Encabezado eFila = matriz.ncbzdoFilas.primero;
            Encabezado eCol  = matriz.ncbzdoColumnas.primero;

            if (eFila != null)
            {
                cabeceraFila += "Matriz ->" + eFila.GetHashCode().ToString() + ";\n";
                while (eFila.siguiente != null)
                {
                    idCabeceraFila += eFila.GetHashCode().ToString() + "[label = \"" + eFila.id.ToString() + "\"];\n";
                    cabeceraFila   += eFila.GetHashCode().ToString() + " -> " + eFila.siguiente.GetHashCode().ToString() + ";\n";

                    eFila = eFila.siguiente;
                }
                idCabeceraFila += eFila.GetHashCode().ToString() + "[label = \"" + eFila.id.ToString() + "\"];\n";
                while (eFila.anterior != null)
                {
                    cabeceraFila += eFila.GetHashCode().ToString() + " -> " + eFila.anterior.GetHashCode().ToString() + ";\n";
                    eFila         = eFila.anterior;
                }
            }
            if (eCol != null)
            {
                cabeceraCol += "Matriz ->" + eCol.GetHashCode().ToString() + ";\n";
                while (eCol.siguiente != null)
                {
                    string conversion = Convert.ToChar(eCol.id).ToString();
                    alineacionCol += eCol.GetHashCode().ToString() + ";";
                    idCabeceraCol += eCol.GetHashCode().ToString() + "[label=\"" + conversion + "\"];\n";
                    cabeceraCol   += eCol.GetHashCode().ToString() + " -> " + eCol.siguiente.GetHashCode().ToString() + ";\n";
                    // MessageBox.Show(eCol.GetHashCode().ToString());
                    enlazarNodosOrtoCol(ref eCol, ref acumOrtogonales, nivel);
                    eCol = eCol.siguiente;
                }
                string conv = Convert.ToChar(eCol.id).ToString();
                enlazarNodosOrtoCol(ref eCol, ref acumOrtogonales, nivel);
                alineacionCol += eCol.GetHashCode().ToString() + ";};\n\n";
                idCabeceraCol += eCol.GetHashCode().ToString() + "[label=\"" + conv + "\"];\n";
                while (eCol.anterior != null)
                {
                    cabeceraCol += eCol.GetHashCode().ToString() + " -> " + eCol.anterior.GetHashCode().ToString() + ";\n";
                    eCol         = eCol.anterior;
                }
            }


            acumInfo += alineacionCol + idCabeceraCol + idCabeceraFila + cabeceraCol + cabeceraFila + "\n\n" + acumOrtogonales + "\n}\n";

            const string f = "matriz.dot";
            StreamWriter w = new StreamWriter(f);

            w.WriteLine(acumInfo);
            w.Close();
            generarImagen("matriz.dot", "matriz.png");
        }
Пример #8
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;
            }
        }