Ho avuto un problela durante la scrittura di un programma che chiedeva di prendere una matrice da un file e salvarla in una matrice allocata dinamicamente, poi tramite un generi una rappresentazione compatta della matrice stessa, trascurando gli elementi nulli, in una struttura dati organizzata come segue:
- un vettore principale di R elementi, allocato dinamicamente
- ogni elemento del suddetto vettore contenga a sua volta un puntatore a un vettore,
allocato dinamicamente, adatto a contenere solamente gli elementi non nulli
- ogni cella dei vettori secondari sia una struct caratterizzata da due campi:
1. indice della colonna associata all'elemento memorizzato
2. valore dell'elemento memorizzato.
Inoltre richiede di accedere all'elemento in posizione <i,j>(riga,colonna) per entrambe le rappresentazioni della matrice.
Ho scritto questo codice solo che non riesco a salvare correttamente i valori non nulli nella struttura:
#include <stdio.h>
#include <stdlib.h>
typedef struct mat {
int col;
int val;
} Mmat;
int main(int argc, char *argv[]) {
Mmat **vett;
int **matrice;
FILE *a;
int R,C;
int i,j,k=0;
int riga,colonna;
int cont=0;
if ( argc != 2 )
printf("Numero di argomenti immessi non valido\n");
else {
if ( (a = fopen(argv[1],"r") ) == NULL )
printf("Impossbile aprire il filen\n");
else {
fscanf(a, "%d %d", &R,&C);
matrice = (int **)malloc(R*sizeof(int *));
for( i=0; i<R; i++ )
matrice[i] = (int *)malloc(C*sizeof(int));
for( i=0; i<R; i++ ) {
for( j=0; j<C; j++ ) {
fscanf(a,"%d", &matrice[i][j]);
}
}
fclose(a);
vett = (Mmat **)malloc(R*sizeof(Mmat *));
for( i=0; i<R; i++ )
vett[i] = (Mmat *)malloc(R*sizeof(Mmat));
for( i=0; j<R; i++ ) {
k=0;
for( j=0; j<C; j++ ) {
if ( matrice[i][j] != 0 ) {
vett[i][k].col = j;
vett[i][k].val = matrice[i][j];
k++;
}
}
}
printf("Inserire il numero della riga e della colonna per accedere al dato\n");
scanf("%d %d", &riga,&colonna);
for( i=0; i<R; i++ ) {
for( j=0; j<C; j++ ) {
if ( (i==riga) && (j==colonna) ) {
printf("Il valore cercato e allocato nella matrice è %d\n", matrice[i][j]);
}
}
}
for( i=0; i<R; i++ ) {
for( j=0; j<C; j++ ) {
if ( vett[i][j].col == colonna )
printf("Il valore cercato e allocato nella struttura di vettori è %d\n", vett[i][j].val);
}
}
}
}
if ( R == C ) {
for ( i=0; i<R ; i++ ) {
for ( j=0; j<R; j++ ) {
if ( matrice[i][j] == matrice[j][i] )
cont++;
}
}
}
if ( cont == R )
printf("Matrice simmetrica\n");
else
printf("Matrice non simmetrica\n");
for ( i=0; i<R ; i++ ) {
for ( j=0; j<C; j++ ) {
printf("%d %d", vett[i][j].col,vett[i][j].val);
}}
return 0;
}
qualcuno potrebbe dirmi come aggiustarlo?
Grazie!!