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 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 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 = (TIPO_G *) calloc(N , sizeof(TIPO_G));
Diagrama
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);
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 :
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 = (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);
free(mat);
/* A continacion se imprime cualquier cosa */
printf("\n edad : %d ",*ptr_edad);
printf("\n saldo : %.3lf ",*ptr_saldo);
return 0;
}