Вы находитесь на странице: 1из 6

Creado por: W, Umberto Antonio Herrador Reyes

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);
}
}