Programacion
Abril 28, 2017, 10:45:46 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: SMF - Just Installed!
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Matrices Dispersas  (Leído 2870 veces)
rromero
Administrator
Newbie
*****
Mensajes: 16


Ver Perfil Email
« : Enero 10, 2011, 09:36:31 »

Hola este es el código principal para definir una matriz dispersa que contenga un árbol sintáctico en cada celda.

typedef struct _nodo {
         int fila;
         int columna;
         int valor;
         struct Arbol *t_arbol; //punter a un árbol.
         struct _nodo *abajo;
         struct _nodo *derecha;
} tipoNodo;

typedef tipoNodo *pNodo;



//****************************************************************
// Función Insertar_celda_a
// inserta una celda en la matriz dispersa
// parámetros:
// *lista: puntero al inicio de la matriz dispersa
// *var  : expresión regular ejem (5+4)/2
// v: valor a insertar en la celda
// f: fila
// c: columna
// Programador: RARF
// fecha de creación   : 01/05/2010
// fecha de actualización   : 01/11/2010
//****************************************************************
void Inserta_celda_a(Lista *lista, char *var, int v, int f, int c)
{
pNodo actual, anterior, cab_col, cab_fil, pos_col, pos_fil,aux_col,aux_fil;
   int flag_busca=0;

   //Busca la Cabecera de Columnas

anterior = actual = *lista;

   do{
      if ((actual->columna) == c){flag_busca=1;aux_col=actual;}
      actual = actual->derecha;
   }while(actual != *lista);

   if(flag_busca==0){
      if(f == -1){
      cab_col=Insertar_cabeza_col_a(lista, var, v, f, c);
      return;
      }
      else{
      cab_col=Insertar_cabeza_col_a(lista, "0",0, -1, c);
      pos_col=Insertar_en_col_a(cab_col, var,v, f, c);
      }
   }else{
      pos_col=Insertar_en_col_a(aux_col,var,v, f, c);
   }
   flag_busca=0;

   //Busca la Cabecera de Filas

anterior = actual = *lista;

   do{
      if ((actual->fila) == f){flag_busca=1;aux_fil=actual;}
      actual = actual->abajo;
   }while(actual != *lista);

   if(flag_busca==0){
      if(c == -1){
      cab_fil=Insertar_cabeza_fil_a(lista, var, v, f, c);
      return;
      }
      else{
      cab_fil=Insertar_cabeza_fil_a(lista, "0", 0, f,-1);
      pos_fil=Insertar_en_fil_a(cab_fil, pos_col, var, v, f, c);

      }
   }else{
      pos_fil=Insertar_en_fil_a(aux_fil,pos_col,var, v, f, c);
   }

}//fin inserta_celda_a


//****************************************************************
// Función Insertar_en_col_a
// inserta una celda en una columnda de la matriz dispersa
// retorna un puntero al nodo cabecera de la columna
// parámetros:
// cab_col: puntero al inicio de la cabecera de la columna matriz dispersa
// *var  : expresión regular ejem (5+4)/2
// v: valor a insertar en la celda
// f: fila
// c: columna
// Programador: RARF
// fecha de creación   : 01/05/2010
// fecha de actualización   : 01/11/2010
//****************************************************************

pNodo Insertar_en_col_a(pNodo cab_col, char *var, int v, int f, int c){
   pNodo actual, anterior, nuevo;
   struct Arbol *nuevo_a=NULL;
   anterior = actual = cab_col;

   // Creamos un nodo para el nuevo valor a insertar
   nuevo  = (pNodo)  malloc(sizeof( tipoNodo));
   nuevo->t_arbol = crea_arbol(&nuevo_a,var);
   nuevo->valor = v;
   nuevo->fila = f;
   nuevo->columna = c;


   if((cab_col) == NULL) {
      cab_col = nuevo;
      cab_col->fila = -1;
      cab_col->columna = c;
      cab_col->valor = 0;
      cab_col->abajo = nuevo;
      cab_col->derecha = nuevo;
      
   return nuevo;}

   // Ubicamos el Elemento
   while(actual->abajo != cab_col  && actual->fila < f){
       anterior = actual;
      actual = actual->abajo;
   }

   //Insertamos el elemento
   if (anterior == NULL || anterior == actual) { /* inserta al principio */
    nuevo->abajo = anterior;
    nuevo->derecha = nuevo;         //Debe Repararse al Insertar en FILA !!!!
   
    nuevo->fila=f;
    nuevo->columna=c;
    nuevo->valor =v;
   
    cab_col->abajo = nuevo;  /* importante: al insertar al principio actuliza la cabecera */
  }
  else {                        /* inserta entre medias o al final */
     if (f<actual->fila){
         nuevo->abajo = actual;
         nuevo->derecha = nuevo;         //Debe Repararse al Insertar en FILA !!!!
   
         nuevo->fila=f;
         nuevo->columna=c;
         nuevo->valor =v;

         anterior->abajo = nuevo;
     }
     else{
         anterior=actual;
         actual = actual->abajo;

         nuevo->abajo = actual;
         nuevo->derecha = nuevo;         //Debe Repararse al Insertar en FILA !!!!
   
         nuevo->fila=f;
         nuevo->columna=c;
         nuevo->valor =v;

         anterior->abajo = nuevo;
     }
  }
  return nuevo;
}//Insertar_en_col_a
En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC XHTML 1.0 válido! CSS válido!