Cómo crear una matriz dinámica
Hola todos:
Estoy trabajando con el manejo de la memoria dinámica y hasta ahora he podido crear vectores dinámicos sin problema. El problema se me ha presentado cuando tengo que crear matrices dinámicas. Un vector no es otra cosa que un apuntador de un nivel de indirección, pero una matriz como la considero?. La lógica sería que la tome con dos niveles de indirección, pero esto no me funciona. Alguno de Uds. conoce como debo crear estas matrices dinámicas?
Gracias
Estoy trabajando con el manejo de la memoria dinámica y hasta ahora he podido crear vectores dinámicos sin problema. El problema se me ha presentado cuando tengo que crear matrices dinámicas. Un vector no es otra cosa que un apuntador de un nivel de indirección, pero una matriz como la considero?. La lógica sería que la tome con dos niveles de indirección, pero esto no me funciona. Alguno de Uds. conoce como debo crear estas matrices dinámicas?
Gracias
mira......una forma de resolver tu problema puede ser creando una estructura matriz con un puntero a una estructura lista que tiene un valor entero, un puntero al siguiente nodo de la estructura lista y un puntero a otra esructura lista que tiene un entero y un puntero al siguiente nodo....
alocando esta estructura vos podes ingresar y sacar datos en la matriz de manera dinamica....
#include <stdio.h>
#include <stdlib.h>
typedef struct Col_str
{
int columna;
double valor;
struct Col_str *pNext;
}ListaColumnas;
typedef struct Fil_str
{
int fila;
ListaColumnas *pColum;
struct Fil_str *pNext;
}ListaFilas;
typedef struct
{
int numFilas;
int numColumnas;
ListaFilas *pFilas;
}MatrizRala;
ListaColumnas *CreateColumna(ListaColumnas *pCol)
{
pCol=(ListaColumnas *)malloc(sizeof(ListaColumnas));
if(!pCol)
{
printf("Error en asignacion de memoria.n");
exit(1);
}
pCol->pNext=NULL;
return pCol;
}
ListaFilas *CreateFila(ListaFilas *pFila)
{
pFila=(ListaFilas *)malloc(sizeof(ListaFilas));
if(!pFila)
{
printf("Error en asignacion de memoria.n");
exit(1);
}
pFila->pColum=NULL;
pFila->pNext=NULL;
return pFila;
}
MatrizRala *CreateMatrizRala(int nFils, int nCols)
{
MatrizRala *nuevo;
nuevo=NULL;
nuevo=(MatrizRala *)malloc(sizeof(MatrizRala));
if(!nuevo)
{
printf("Error en asignacion de memoria.n");
exit(1);
}
nuevo->numFilas=nFils;
nuevo->numColumnas=nCols;
return nuevo;
}
suerte
alocando esta estructura vos podes ingresar y sacar datos en la matriz de manera dinamica....
#include <stdio.h>
#include <stdlib.h>
typedef struct Col_str
{
int columna;
double valor;
struct Col_str *pNext;
}ListaColumnas;
typedef struct Fil_str
{
int fila;
ListaColumnas *pColum;
struct Fil_str *pNext;
}ListaFilas;
typedef struct
{
int numFilas;
int numColumnas;
ListaFilas *pFilas;
}MatrizRala;
ListaColumnas *CreateColumna(ListaColumnas *pCol)
{
pCol=(ListaColumnas *)malloc(sizeof(ListaColumnas));
if(!pCol)
{
printf("Error en asignacion de memoria.n");
exit(1);
}
pCol->pNext=NULL;
return pCol;
}
ListaFilas *CreateFila(ListaFilas *pFila)
{
pFila=(ListaFilas *)malloc(sizeof(ListaFilas));
if(!pFila)
{
printf("Error en asignacion de memoria.n");
exit(1);
}
pFila->pColum=NULL;
pFila->pNext=NULL;
return pFila;
}
MatrizRala *CreateMatrizRala(int nFils, int nCols)
{
MatrizRala *nuevo;
nuevo=NULL;
nuevo=(MatrizRala *)malloc(sizeof(MatrizRala));
if(!nuevo)
{
printf("Error en asignacion de memoria.n");
exit(1);
}
nuevo->numFilas=nFils;
nuevo->numColumnas=nCols;
return nuevo;
}
suerte
Alguien sabe como crear una miatriz dinamica en borland c++ 3.1 de mas de (100*100), del orden de (1000*1000) o mas?
gracias
gracias
Illo, tan facil como esto:
#include <stdio.h>
#include <stdlib.h>
int main (void){
float **m;
unsigned int nf=10, nc=10, i;
m=(float **)malloc(nc*sizeof(float *));
for (i=0; i<nc; i++)
m[i]=(float *)malloc(nf*sizeof(float));
// matriz creada y lista para trabajar
// haz lo que quieras con ella
// ahora que ya no la necesitas, libera
// memoria
for (i=0; i<nc; i++)
free(m[i]);
free(m);
}
Esto te crea una matriz de nc columnas y nf filas. El acceso a cada elemento se hace m[i][j]
i para las columnas, y j para las filas.
Para liberar la memoria ocupada.:
#include <stdio.h>
#include <stdlib.h>
int main (void){
float **m;
unsigned int nf=10, nc=10, i;
m=(float **)malloc(nc*sizeof(float *));
for (i=0; i<nc; i++)
m[i]=(float *)malloc(nf*sizeof(float));
// matriz creada y lista para trabajar
// haz lo que quieras con ella
// ahora que ya no la necesitas, libera
// memoria
for (i=0; i<nc; i++)
free(m[i]);
free(m);
}
Esto te crea una matriz de nc columnas y nf filas. El acceso a cada elemento se hace m[i][j]
i para las columnas, y j para las filas.
Para liberar la memoria ocupada.:
ES la primer vez k posteo en el foro, así que hola a todo el mundo. Alguien podría explicarme, porqué en e esta función m es de tipo float, gracias
Hola todos:
Ya encontré la solución a mi problema. La prueba la he hecho en un entorno Turbo C. Posteriormente la haré en otro compilador GNU. Bueno vean lo que he hecho:
int **num=NULL,i;
num=(int **)malloc(sizeof(int)*10);
for(i=0; i<10; i++)
{
num[i]=(int *)malloc(sizeof(int)*10);
}
Así he creado una matriz de 10*10. El error que cometía, estaba que en el primer nivel de inderección cuando pedia memoria, no colocaba los 2 asteriscos **. El segundo error lo tenía cuando enviaba la matriz a una función, pues la recibia estática -> int num[10][10]. Ahora la recibo -> int **num. Todo me funciona. De todas maneras si alguíen conoce algo más óptimo, aprovechemos este foro para subir el nivel.
Suerte a todos los amantes del C.
Chao
Ya encontré la solución a mi problema. La prueba la he hecho en un entorno Turbo C. Posteriormente la haré en otro compilador GNU. Bueno vean lo que he hecho:
int **num=NULL,i;
num=(int **)malloc(sizeof(int)*10);
for(i=0; i<10; i++)
{
num[i]=(int *)malloc(sizeof(int)*10);
}
Así he creado una matriz de 10*10. El error que cometía, estaba que en el primer nivel de inderección cuando pedia memoria, no colocaba los 2 asteriscos **. El segundo error lo tenía cuando enviaba la matriz a una función, pues la recibia estática -> int num[10][10]. Ahora la recibo -> int **num. Todo me funciona. De todas maneras si alguíen conoce algo más óptimo, aprovechemos este foro para subir el nivel.
Suerte a todos los amantes del C.
Chao
