Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Matrices dinámicas

Para crear una matriz de elementos de tipo : TIPO_G (tipo genérico) debemos crear en primer lugar, un arreglo de punteros de este tipo de dato.

Para esto , utilizamos un doble puntero para almacenar la dirección del primer elemento del arreglo y a su vez para indireccionar en forma correcta.

TIPO_G **mat = NULL;

Para crear el arreglo de tamaño N, reservamos memoria con la función calloc.

mat =  (TIPO_G **) calloc ( N , sizeof (TIPO_G *) );

Nota : El valor almacenado en mat[i] es un puntero

Ya que cada elemento del arreglo es un puntero de tipo TIPO_G, a cada uno de estos le podemos asociar un arrreglo dinámico.

Supongamos que a cada mat[i] le asignamos un arreglo de TIPO_G de tamaño N, para obtener una matriz cuadrada (NxN). Para ello, a través de un ciclo for, recorremos el arreglo de punteros mat asignando memoria dinamica con la función calloc.

for(int i = 0; i < N ; i++)
    mat[i] = (TIPO_G *) calloc(N , sizeof(TIPO_G));

Diagrama


dgr8.gif (1750 bytes)

Después de reservar memoria, se accede a los elementos de la matriz en forma común.

LIBERAR MEMORIA

Para liberar toda la memoria reservada , tenemos que empezar por liberar cada elemento del arreglo de punteros.

Ej : for(int i = 0; i < N ; i++) free(mat[i]);

A continuación, se libera el espacio reservado para guardar los punteros (arreglo) a través del doble puntero.

Ej : free(mat);

Ejercicio

Dada la siguiente estructura :

typedef struct
{
   int edad;
   double saldo; 
} INFO;

Crear un estructura que guarde este tipo de datos, de la forma :
dgr9.gif (1272 bytes)

Solución :

#include<stdlib.h>
#include<stdio.h>

typedef struct
{
   int edad;
   double saldo;
} INFO;

/* se declara que TIPO_G es de tipo INFO */

typedef INFO TIPO_G;

/* función que crea la seudo-matriz */

TIPO_G **crear_matriz(int n)
{ 
   TIPO_G **aux = NULL;
   aux = (TIPO_G **) calloc(n , sizeof(TIPO_G *));
 
   for(int i = 0; i < n ; i++ )
      aux[i] = (TIPO_G *) calloc ( i + 1, sizeof(TIPO_G));
 
   return aux;
}


int main()
{ 

   TIPO_G **mat = crear_matriz(4);

/* se asignan valores a la fila 1 , columna 0 de la estructura */

   mat[1][0].edad = 22; 
   mat[1][0].saldo = 106.456;

/* se guadan direcciones de los datos ingresados */

   int *ptr_edad = &mat[1][0].edad; 
   double *ptr_saldo = &mat[1][0].saldo;

/* se libera memoria */
 
   for(int i = 0; i < 4; i++) free(mat[i]);

   free(mat);

/* A continacion se imprime cualquier cosa */

   printf("\n edad : %d ",*ptr_edad);
   printf("\n saldo : %.3lf ",*ptr_saldo);
   return 0;
}