public Encabezado(int id) { this.id = id; this.siguiente = null; this.anterior = null; this.acceso = null; }
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); }
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); }
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"; } }
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++; } } } }
public Nodo buscarNodoCol(ref Encabezado eCol) { return(null); }
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"); }
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; } }