Cualquier duda est abierto el foro: http://foro-programing.blogspot.com/
Blog: http://ing-ciencias-y-sistmas.blogspot.com/
Matriz Ortogonal
Figura 1: matriz Ortogonal 3X3 punto inicial cero. Una matriz ortogonal se compone de cuatro apuntadores Arriba,Abajo,Derecha,Izquierda bsicamente la matriz ortogonal es un conjunto de listas doblemente ligadas donde cada lista tiene una cabeza ya sea en forma vertical 0,1,2o horizontal 0,1,2 y a su vez estas cabezas tienen una cabeza principal, en el caso de la figura 1 est representado como i Tomando como base el nodo i de la figura 1 vamos decir que todos los nodos que estn a la derecha del Nodo i son Nodos Columna es decir representan las cabezas de columnas de la matriz. derecha
i 0 1 2 0 0,0 0,1 0,2 1 1,0 1,1 1,2 2 2,0 2,1 2,2 datos Cabeza Principal Cabezas Columna Cabezas Fila
Tomando como base el Nodo i de la figura 1 vamos a decir que todos los Nodos que estn hacia abajo del Nodo i son Nodos Fila es decir representan las cabezas de Filas de la matriz.
Abajo
Como ya se podran dar cuenta se van utilizar los mismo mtodos de (insercin, Eliminacin) del tutorial de la lista doblemente ligada Para poder hace la insercin de la matriz ortogonal se van utilizar dos mtodos los cuales son: NuevaColumna() , NuevaFila() y las siguientes restricciones La cabeza Principal ya deber existir para para poder hacer las inserciones. Las cabezas de fila y columna no de ven aparecer ocupando memoria si no hay un dato especfico en esa posicin por ejemplo: si esta lista de coordenadas (0,2) (1,2) (2,2) (2,0) (2,1) no existiera entonces eso significa que la cabeza 2 de columna y cabeza 2 de Fila no existen por el momento. i 0 1 2 i 0 1 2
Las insercin se divide en dos sub inserciones las cuales son: Insercin de cabezas (columna y fila) o Insertar Columna Se tiene que utilizar el mtodo NuevaColumna() o Insertar Fila Se tiene que utilizar el mtodo NuevaFila() Insercin de datos (Columna y fila) Dado la naturaleza de los mtodos para insertar Columna y Fila de las cabezas (Columna,fila), se puede re-utilizar los mismos mtodos para poder ingresar datos, solamente intercambiando el orden, a simple vista se mira confuso dado a que para insertar un dato en la cabeza de la columna se tiene que utilizar el mtodo NuevaFila(), porque este mtodo ingresa Nodos hacia abajo ajustndose a la necesidad de la cabeza Columna, en cambio el mtodo NuevaColumna() ingresa Nodos hacia la derecha ajustndose a la necesidad de la cabeza Fila. o Insertar Dato en Columna Metodo a utilizar NuevaFila() o Insertar Dato en Fila Metodo a utilizar NuevaColumna()
Buscar Nodo Tambin se realizar el mismo mtodo de bsqueda que el tutorial de la lista doblemente ligada para esta operacin se crean dos mtodos BuscarFila() BuscarColumna() Se pude buscar en los siguientes rdenes les da el mismo resultado Primero Columna y luego Fila Primero Fila y luego Columna Tomando como referencia Nodo i de la figura 1 se busca hacia la derecha para poder encontrar la columna correspondiente y luego se busca hacia abajo para poder encontrar el nodo buscado si el nodo no existe se manda un mensaje de inexistencia.
Eliminar nodo Para poder eliminar un Nodo solamente se tiene que hacer un sondeo de los cuatro apuntadores que tiene el nodo a las diferentes localidades de memoria re-apuntar los nodos. public void Eliminar(Nodo CabezaPrincial,int i,int j){ Nodo auxColumna; Nodo auxFila; //eliminar dato Nodo nodoBuscado = this.Buscar(CabezaPrincial, i, j); if(nodoBuscado!=null){ if(nodoBuscado.arriba!=null){ nodoBuscado.arriba.Cambiar_abajo(nodoBuscado.abajo); } if(nodoBuscado.abajo!=null){ nodoBuscado.abajo.Cambiar_arriba(nodoBuscado.arriba); } if(nodoBuscado.izquierda!=null){ nodoBuscado.izquierda.Cambiar_derecha(nodoBuscado.derecha); } if(nodoBuscado.derecha!=null){ nodoBuscado.derecha.Cambiar_izquierda(nodoBuscado.izquierda); } nodoBuscado.Cambiar_arriba(null); nodoBuscado.Cambiar_abajo(null); nodoBuscado.Cambiar_derecha(null); nodoBuscado.Cambiar_izquierda(null); } //eliminar columna if(CabezaPrincial.derecha!=null){ auxColumna=CabezaPrincial.derecha; do{ if(auxColumna.abajo==null){ if(auxColumna.izquierda!=null){ auxColumna.izquierda.Cambiar_derecha(auxColumna.derecha); } if(auxColumna.derecha!=null){ auxColumna.derecha.Cambiar_izquierda(auxColumna.izquierda); } auxColumna.Cambiar_derecha(null); auxColumna.Cambiar_izquierda(null); } auxColumna=auxColumna.derecha; }while(auxColumna!=null); } //eliminar fila if(CabezaPrincial.abajo!=null){ auxFila=CabezaPrincial.abajo; do{ if(auxFila.derecha==null){ if(auxFila.arriba!=null){ auxFila.arriba.Cambiar_abajo(auxFila.abajo); } if(auxFila.abajo!=null){ auxFila.abajo.Cambiar_arriba(auxFila.arriba); } auxFila.Cambiar_abajo(null); auxFila.Cambiar_arriba(null); } auxFila=auxFila.abajo; }while(auxFila!=null); } }