Este programa pide al usuario introducir una matriz (usando una estructura con campo puntero a puntero), y después pide introducir un numero de fila. La fila introducida se va metiendo, elemento a elemento, en un nodo de una nueva lista enlazada, algo así:
Código:
La matriz se crea bien, y se muestra bien.Matriz: (1 2 3) (4 5 6) -----> selecciono fila 1 (7 8 9) -Entonces: Lista enlazada: raiz -> [4] -> [5] -> [6] -> NULL
El error está en la función de extraerFilaLiberarMatriz, se llama así pero aun no he hecho la parte de liberar la matriz jeje. Alguna sugerencia? He depurado y el error puede ser que me falta "allocar" algo en memoria pero no se qué...
Código:
//
#include <stdio.h>
#include <stdlib.h>
typedef int * intRef;
typedef struct matInt {
int **m;
int numFil, numCol;
} matInt;
typedef matInt* matIntRef;
typedef int tipoInfo;
typedef tipoInfo *tipoInfoRef;
typedef struct tipoNodo {
tipoInfo info;
struct tipoNodo * sig;
} tipoNodo;
typedef tipoNodo *tipoNodoRef;
typedef tipoNodo * ListaEnlazada;
typedef ListaEnlazada *ListaEnlazadaRef;
ListaEnlazadaRef extraerFilaLiberarMatriz(matIntRef matriz, int nFila);
int leerMatInt(matIntRef );
matIntRef crearMatInt(int numFil, int numCol, intRef errNum);
int mostrarMatInt(matIntRef);
int main (int argc, const char * argv[]) {
int i;
int f, c, fila_a_lista, errNum;
matIntRef mat;
ListaEnlazadaRef lista = NULL;
tipoNodoRef indice = NULL;
printf("\n\nDimensiones de las matrices:\n\n");
printf("Numero filas: ");
scanf("%d", &f);
printf("\nNumero columnas: ");
scanf("%d", &c);
printf("Introducir valores Matriz: \n");
if (NULL != (mat = crearMatInt(f, c, &errNum)))
leerMatInt(mat);
else
printf("Fallo creación matriz: %d\n",errNum);
printf("Introducir FILA a extraer: \n");
scanf("%d", &fila_a_lista);
mostrarMatInt(mat);
if((lista = extraerFilaLiberarMatriz(mat, fila_a_lista)) == NULL)
printf("Fallo extraer fila\n");
indice = *lista;
while (indice != NULL) {
printf("- %d - ", indice->info);
indice = indice -> sig;
}
return 0;
}
ListaEnlazadaRef extraerFilaLiberarMatriz(matIntRef matriz, int nFila) {
int i;
ListaEnlazadaRef raiz = NULL;
tipoNodoRef nuevo = NULL, aux = NULL;
printf("LLEGO");
for (i=0; i<(matriz->numCol); i++) {
nuevo = (tipoNodoRef) malloc(sizeof(tipoNodo));
nuevo->info = matriz->m[nFila][i];
nuevo->sig = NULL;
aux = *raiz;
if (aux == NULL) {
*raiz = nuevo;
}
else {
while (aux -> sig != NULL) {
aux = aux -> sig;
}
aux -> sig = nuevo;
}
}
return raiz;
}
matIntRef
crearMatInt(int numF, int numC, intRef errNum)
{
matIntRef temp;
int i;
if (!(numF > 0 && numC > 0)) {
#ifdef DEBUG
fprintf(stderr, "Error: dimensiones incorrectas: %d, %d\n",numF,numC);
#endif
*errNum = -1;
return NULL;
}
if (NULL == (temp = malloc(sizeof(matInt)))){
#ifdef DEBUG
fprintf(stderr, "Error: fallo reserva memoria tipo matriz\n");
#endif
*errNum = -2;
return NULL;
}
else if (NULL == (temp->m = malloc(numF*sizeof(int *)))){
#ifdef DEBUG
fprintf(stderr, "Error: fallo reserva memoria matriz\n");
#endif
free(temp);
*errNum = -3;
return NULL;
}
else {
temp->numFil = numF;
temp->numCol = numC;
for (i = 0; i < numF; i++) {
if (NULL == (temp->m[i] = malloc(numC*sizeof(int)))){
for (i--; i >= 0; i--)
free(temp->m[i]);
free(temp->m);
free(temp);
#ifdef DEBUG
fprintf(stderr, "Error: fallor reserva memoria matriz\n");
#endif
*errNum = -4;
return NULL;
}
}
*errNum = 0;
return temp;
}
}
int
leerMatInt(matIntRef mat)
{
int i,j,res;
for (i=0; i < mat->numFil; i++) {
for (j=0; j < mat->numCol; j++) {
printf("mat[%d][%d] = ",i,j);
scanf("%d%*c",&(mat->m[i][j]));
//scanf("%d%*c",(*(mat->m + i) + j));
}
}
return 0;
}
int
mostrarMatInt(matIntRef matriz)
{
int i,j;
for (i = 0; i < matriz->numFil; i++) {
printf("| ");
for (j = 0; j < matriz->numCol; j++) {
printf("%d",matriz->m[i][j]);
//printf(c,*(*(mat->m + i) + j));
}
printf(" |\n");
}
return 0;
}



