Sto facendo un programma che chiede di inserire delle triple(riga, colonna e valore) di una matrice e le inserisce in una matrice sparsa, di questa poi ne fa una matrice trasposta, funziona tutto tranne alla fine che stampa tutta la matrice trasposta escluso un numero e da errore di segmentation fault...Il problema dovrebbe essere o nel main o nella funzione di trasposizione ma non essendo sicuro allego l'intero codice e lo screen dell'errore
image uploader
#include <stdio.h>
#include <stdlib.h>
#define NUMC 15
#define NUMR 10
typedef struct{
int riga;
int colonna;
int valore;
}Mat_spar;
int numUsedIntegerClassic;
int numUsedIntegerSparse;
void fill_classic_matrix(int matrix[][NUMC], int numr, int numc);
void print_classic_matrix(int matrix[][NUMC], int numr, int numc);
void search_element_in_classic_matrix(int matrix[][NUMC], int numr, int numc, int numric);
Mat_spar* fill_sparse_matrix(int, int, int);
void print_sparse_matrix(Mat_spar *, int, int, int);
void search_element_in_sparse_matrix(Mat_spar *, int, int);
Mat_spar *trasp_rapida(Mat_spar *, Mat_spar *);
int main()
{
int matrix[NUMR][NUMC] = {{0}};
int numric=71; // assegnare a num il numero da cercare.
int numrig, numcol, nelem;
Mat_spar *matrice_sparsa, *matrice_trasp=NULL;
matrice_trasp=malloc(nelem+1*sizeof(Mat_spar));
// INIZIO TEST MATRICE CLASSICA
fill_classic_matrix(matrix, NUMR, NUMC);
print_classic_matrix(matrix, NUMR, NUMC);
search_element_in_classic_matrix(matrix, NUMR, NUMC, numric);
// FINE TEST MATRICE CLASSICA
printf("Inserisci numero di righe: ");
scanf("%d", &numrig);
printf("Inserisci numero di colonne: ");
scanf("%d", &numcol);
printf("Inserisci numero di elementi non nulli: ");
scanf("%d", &nelem);
matrice_sparsa = fill_sparse_matrix(numrig, numcol, nelem);
print_sparse_matrix(matrice_sparsa, numrig, numcol, nelem);
search_element_in_sparse_matrix(matrice_sparsa, nelem, numric);
matrice_trasp=trasp_rapida(matrice_sparsa, matrice_trasp);
print_sparse_matrix(matrice_trasp, numcol, numrig, nelem);
return 0;
}
void fill_classic_matrix(int matrix[][NUMC], int numr, int numc)
{
matrix[1][0] = 71;
matrix[2][14] = 99;
matrix[3][11] = 53;
matrix[4][7] = 95;
matrix[6][14] = 39;
matrix[8][1] = 27;
matrix[9][14] = 14;
}
void print_classic_matrix(int matrix[][NUMC], int numr, int numc)
{
int i, j = 0;
for(i=0; i<numr; i++)
{
for(j=0; j<numc; j++)
{
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
}
void search_element_in_classic_matrix(int matrix[][NUMC], int numr, int numc, int numric)
{
int i, j = 0;
for(i=0; i<numr; i++)
{
for(j=0; j<numc; j++)
{
if(matrix[i][j] == numric)
{
printf("Elemento %d trovato in posizione (%d, %d).\n", numric, i, j);
return;
}
}
}
printf("Elemento non trovato.\n");
}
Mat_spar* fill_sparse_matrix(int numrig, int numcol, int nelem){
Mat_spar *matrice_sparsa=(Mat_spar *)malloc(nelem+1*sizeof(Mat_spar));
int i;
matrice_sparsa[0].riga=numrig;
matrice_sparsa[0].colonna=numcol;
matrice_sparsa[0].valore=nelem;
for(i=1; i<nelem+1; i++){
printf("Inserisci riga: ");
scanf("%d", &matrice_sparsa[i].riga);
printf("Inserisci colonna: ");
scanf("%d", &matrice_sparsa[i].colonna);
printf("Inserisci valore: ");
scanf("%d", &matrice_sparsa[i].valore);
}
return matrice_sparsa;
}
void print_sparse_matrix(Mat_spar *matrice_sparsa, int numrig, int numcol, int nelem){
int i, j, k;
int variabile=0;
for(i = 0; i < numrig; i++){
for(j = 0; j < numcol; j++){
for(k = 1; k < nelem+1; k++)
if(i == matrice_sparsa[k].riga && j == matrice_sparsa[k].colonna){
printf("%d\t", matrice_sparsa[k].valore);
variabile = 1;
}
if(variabile == 0)
printf("0\t");
else
variabile = 0;
}
printf("\n");
}
}
void search_element_in_sparse_matrix(Mat_spar *matrice_sparsa, int nelem, int numric){
int i;
for(i=0; i<nelem; i++)
{
if(matrice_sparsa[i].valore == numric){
printf("Elemento %d trovato in posizione (%d, %d).\n", numric, matrice_sparsa[i].riga, matrice_sparsa[i].colonna);
return;
}
}
printf("Elemento non trovato.\n");
}
Mat_spar *trasp_rapida(Mat_spar *a, Mat_spar *b){
int num_col = a[0].colonna;
int num_val = a[0].valore;
int cur_pos;
int i;
b[0].riga = num_col;
b[0].colonna = a[0].riga;
b[0].valore = num_val;
int *termini_riga;
int *pos_iniziale;
termini_riga=malloc(num_col*sizeof(int));
pos_iniziale=malloc(num_col*sizeof(int));
if(num_val > 0){
// creazione termini_riga
for(i = 0; i < num_col; i++){
termini_riga[i] = 0;
}
for(i = 1; i <= num_val; i++){
termini_riga[a[i].colonna] = termini_riga[a[i].colonna]+1;
}
// creazione pos_iniziale
pos_iniziale[0] = 1;
for(i=1; i < num_col; i++){
pos_iniziale[i] = pos_iniziale[i-1]+termini_riga[i-1];
}
//trasposizione
for(i=1; i <= num_val; i++){
cur_pos = pos_iniziale[a[i].colonna];
pos_iniziale[a[i].colonna] = pos_iniziale[a[i].colonna]+1;
b[cur_pos].riga = a[i].colonna;
b[cur_pos].colonna = a[i].riga;
b[cur_pos].valore = a[i].valore;
}
}
return b;
}