private NodoO ordenarNodo(NodoO nodo_base) { NodoO aux = nodo_base; while (aux.bottom != null) { aux = aux.bottom; }//ahora trabajo con el Node mas bajo //y me voy de regreso para arreglar while (aux.top != null) { if (aux.item.Z == 1)//si es un barco, ese se queda como el principal { break; } else if (aux.item.Z == 2) { break; } aux = aux.top; }//si al final no habia barco, por defecto el nivel de avion, luego el de satelite, si solo hay submarino ese queda aux.up = nodo_base.up; nodo_base.up.down = aux; aux.izq = nodo_base.izq; nodo_base.izq.der = aux; return(aux); }
public bool insertar(Unidad item, int fila, string columna) { Node <NodoO> row = buscarRow(fila); Node <NodoO> col = buscarCol(columna); if (row == null) { addRow(fila); row = buscarRow(fila);//en teoria ya no deberia ser null en este punto } if (col == null) { addColumn(columna); col = buscarCol(columna);//en teoria ya no deberia ser null en este punto } NodoO aux = insertarEnColumna(col.item, col.item.down, item, fila, columna); insertarEnFila(row.item, row.item.der, aux); if (aux == null) { return(false); } else { return(true); } }
private NodoO insertarEnColumna(NodoO actual, NodoO down, Unidad item, int fila, string columna) { if (down == null) { actual.down = new NodoO(item, fila, columna); actual.down.up = actual; return(actual.down); } else if (columna.CompareTo(down.columna) < 0) //va arriba de down y abajo de actual { actual.down = new NodoO(item, fila, columna); //actual apunta a nuevo actual.down.up = actual; //nuevo apunta a actual actual.down.down = down; //nuevo apunta a down down.up = actual.down; //down apunta a nuevo return(actual.down); } else if (columna.CompareTo(down.columna) > 0) { return(insertarEnColumna(down, down.down, item, fila, columna)); } else { if (fila < down.fila) { actual.down = new NodoO(item, fila, columna); //actual apunta a nuevo actual.down.up = actual; //nuevo apunta a actual actual.down.down = down; //nuevo apunta a down down.up = actual.down; //down apunta a nuevo return(actual.down); } else if (fila > down.fila) { return(insertarEnColumna(down, down.down, item, fila, columna)); } else//codigo para insertar en diferente nivel { if (down.item.Z > item.Z)//si el que esta actualmente en el Node, va arriba del nuevo { down.bottom = new NodoO(item, fila, columna); down.bottom.top = down; return(ordenarNodo(down)); } else if (down.item.Z < item.Z)//el que esta actualmente en el Node, va debajo del nuevo { down.top = new NodoO(item, fila, columna); down.top.bottom = down; return(ordenarNodo(down)); } else { return(null); } } } }
private NodoO buscarZ(int z, NodoO raiz) { NodoO aux = raiz; while (aux.bottom != null) { aux = aux.bottom; } while (aux != null) { if (aux.item.Z == z) { break; } aux = aux.top; } return(aux); }
private void insertarEnFila(NodoO actual, NodoO siguiente, NodoO nuevo) { if (nuevo == null) { //significa que la unidad cayo en un espacio repetido, no hago nada } else if (siguiente == null) { actual.der = nuevo; nuevo.der = actual; } else if (nuevo.fila < siguiente.fila) //va anterior de siguiente y siguiente de actual { actual.der = nuevo; //actual apunta a nuevo nuevo.izq = actual; //nuevo apunta a actual nuevo.der = siguiente; //nuevo apunta a down siguiente.der = nuevo; //down apunta a nuevo } else if (nuevo.fila > siguiente.fila) { insertarEnFila(siguiente, siguiente.der, nuevo); } else { if (nuevo.columna.CompareTo(siguiente.columna) < 0) { actual.der = nuevo; //actual apunta a nuevo nuevo.izq = actual; //nuevo apunta a actual nuevo.der = siguiente; //nuevo apunta a down siguiente.izq = nuevo; //down apunta a nuevo } else if (nuevo.columna.CompareTo(siguiente.columna) > 0) { insertarEnFila(siguiente, siguiente.der, nuevo); } else { } } }
private string codigoNodos(Node <NodoO> fila, int nivel = 1) { string salida = ""; Node <NodoO> aux = fila; NodoO actual; NodoO actual_Z; while (aux != null) { actual = aux.item; actual = actual.der;//el primero es la raiz i ese no tiene nada salida += "{rank=same;\n"; while (actual != null) { actual_Z = buscarZ(nivel, actual); //este seria el nodo en el nivel que estoy buscando if (actual_Z != null) //si hay algo en ese nivel { Unidad coso = actual_Z.item; salida += "orto" + actual_Z.fila + "_" + actual_Z.columna + "[label=\"" + coso.Tipo + "\nVida:" + coso.Hp + "\nMov:" + coso.Movimiento + "\nRango:" + coso.Alcance + "\";shape=box;height=.7;width=.7;fixedsize=true;fontsize=8];\n"; if (actual.izq.item == null)//apunta a la raiz que esta dentro de la fila, necesito usar a nodo raiz, no a nodo Z { salida += "row" + aux.key + "->orto" + actual_Z.fila + "_" + actual_Z.columna + "[dir=both;weight=0];\n"; } if (actual.izq.item != null) //apunta a una unidad { NodoO companyero_izq = buscarZ(nivel, actual.izq); //busco a ver si tiene un compañero if (companyero_izq != null) //el codigo no necesita que lo haga con actual Z o companyero, eso da igual { salida += "orto" + actual.izq.fila + "_" + actual.izq.columna + "->orto" + actual.fila + "_" + actual.columna + "[dir=both;weight=0];\n"; } } } actual = actual.der; } salida += "}\n"; actual = aux.item; actual = actual.der; //el primero es la raiz y ese no tiene nada while (actual != null) //columnas { actual_Z = buscarZ(nivel, actual); //para terminar, con las columnas if (actual_Z != null) { Unidad coso = actual_Z.item; if (actual.up.item != null) { NodoO companyero_izq = buscarZ(nivel, actual.up);//busco a ver si tiene un compañero salida += "orto" + actual.up.fila + "_" + actual.up.columna + "->orto" + actual.fila + "_" + actual.columna + "[dir=both];\n"; } else// (actual.up.item == null) { salida += "col" + actual.columna + "->orto" + actual.fila + "_" + actual.columna + "[dir=both];\n"; } } actual = actual.der; } salida += "\n"; aux = aux.siguiente; } return(salida); }