Salve a tutti, avrei sto avendo un problema nello stendere un algoritmo che stampi a schermo una matrice sparsa di "rig" righe e "col" colonne, che contenga "valori" valori non nulli. E' richiesto che la stampa venga eseguita tramite delle triple costituite dai dati "riga,colonna,valore". Per fare un esempio la seguente matrice (che è anche come dovrei stampare la matrice sul programma, senza parentesi quadre):

[10 0 0]
[ 0 0 7]
[ 0 0 0]
avrà una rappresentazione in un array di triple
A[0]=3,3,2
A[1]=1,1,10
A[2]=2,3,7
Dove il primo elemento dell'array A[0] contiene il numero di righe, di colonne e di valori non nulli. I restanti elementi indicano in quale riga e in quale colonna si trova quale valore non nullo.
Il mio ragionamento è il seguente: faccio un doppio ciclo for (usando come indici i,j) e utilizzo un terzo indice k inizializzato ad 1. Il doppio for scorrerà tutti gli elementi della matrice e controllerà ad ogni passaggio se in A[k] trovo esattamente quella riga e quella colonna. Se è così stamperà A[k].valore e incrementerà k, in caso contrario stamperà zero. In aggiunta ogni volta che si stampa un valore k viene incrementato solo se è <= del numero dei valori non nulli. Infine se il secondo indice j (quello delle colonne) raggiunge effettivamente il numero delle colonne, oltre a stampare lo zero va anche accapo. Come ragionamento mi sembra giusto, ma quando vado a compilare escono meno numeri di quanti ne dovrei vedere e in ordine sballato. Scusatemi se sono stato prolisso ma ho preferito spiegare bene prima di chiedere aiuto. Questo è il codice, se sapeste aiutarmi mi dareste un aiuto tremendo, davvero. Grazie e buona serata.

codice:
#include <stdio.h>#include <stdlib.h>
#define MAX_COL 200
#define MAX_RIG 200
#define MAX_VALORI 200*200
int main()
{
    int rig=(MAX_COL+1), col=(MAX_COL+1),valori=(MAX_VALORI+1),i, j, k=1, temp, choice;
    typedef struct
    {
        int riga;
        int colonna;
        int valore;
    }matrice;
    printf("Software di gestione per matrici sparse");
    while(rig>MAX_RIG)
    {
       printf("\nQuante righe ha la tua matrice? (valore massimo: 200)\n");
       scanf("%d",&rig);
       if(rig>MAX_RIG) {printf("\nvalore non ammesso\n");}
    }
    while(col>MAX_COL)
    {
        printf("\nQuante colonne ha la tua matrice? (valore massimo: 200)\n");
        scanf("%d",&col);
        if(col>MAX_COL) {printf("\nvalore non ammesso\n");}
    }
    while(valori>(rig*col))
    {
        printf("quanti valori non nulli ha la tua matrice? (valore massimo: 200)\n");
        scanf("%d",&valori);
        if(col>(rig*col)) {printf("\nvalore non ammesso\n");}
    }
    matrice A[valori+1];
    A[0].riga=rig;
    A[0].colonna=col;
    A[0].valore=valori;
    printf("\nInserisci riga, colonna e valore, volta per volta e premi invio dopo ogni dato immesso:\n");
    for(i=1;i<=valori;i++)
    {
        temp=MAX_RIG+1;
        while(temp>rig)
        {
            printf("\n riga: ");
            scanf("%d",&temp);
            A[i].riga=temp;
            if(temp>rig) {printf("\nil valore non e' valido\n");}
        }temp=MAX_COL+1;
        while(temp>col)
        {
            printf("\n colonna: ");
            scanf("%d",&temp);
            A[i].colonna=temp;
            if(temp>col) {printf("\nil valore non e' valido\n");}
        }
        printf("\n valore: ");
        scanf("%d",&temp);
        A[i].valore=temp;
        printf("\n");
    }
    printf(" 1: visualizzazione     2: ricerca     3) trasposizione\n ");
    scanf("%d",&choice);
    printf("\n");
    switch(choice)
    {


        case(1):
              for(i=1;i<=(rig);i++)
              {
                  for(j=1;j<=(col);j++)
                  {
                     if((A[k].riga==i)&&(A[k].colonna==j)&&(k<=valori))
                     {
                        printf(" %d ",A[k].valore);
                        {k++;}
                     }
                     else
                     {
                      printf(" 0 ");
                      if(j=col){printf("\n");}
                     }
                  }
              }
        break;
    }


}