2017-08-30 59 views
0

我目前正在做一個稀疏矩陣加法的問題。我正在通過使用三元組形式製作稀疏矩陣。三重形式是通過使用c中的結構製成的。在c中使用結構添加稀疏矩陣(三元組形式)

struct sparse 
{ 
    int row; 
    int col; 
    int val; 
}; 

但在做這個稀疏矩陣問題,我遇到了我的代碼只顯示當我給非零值的索引按升序排列(正確的稀疏矩陣如:(0 1 3)1問題( 2 5),(2 2 7)等),否則它會顯示不正確的矩陣。例如,如果給出像(0 1 3),(2 2 7),(1 2 5)等輸入,那麼它顯示錯誤的矩陣。如何解決這個問題,以任何順序的指數,它會給出正確的輸出?

我已經添加了我的輸入和結果輸出。我已經做了兩個稀疏矩陣。

#include<iostream> 
#include<cstdio> 
struct sparse 
{ 
    int row,col,val; 
}; 
void readmat(sparse sp[]) 
{ 
    printf("enter total number number of rows ,column of matrix and total 
    of nonzero values in this\n");    
    scanf("%d %d %d",&sp[0].row,&sp[0].col,&sp[0].val); 
    printf("now start entering the values by specifying index 
    position\n"); 
    for(int i=1;i<=sp[0].val;i++) 
     scanf("%d %d %d",&sp[i].row,&sp[i].col,&sp[i].val); 
} 
void displaymat(sparse sp[]) 
{ 
    int k=1; 
    for(int i=0;i<sp[0].row;i++) 
    { 
     for(int j=0;j<sp[0].col;j++) 
     { 
      if(k<=sp[0].val&&i==sp[k].row&&j==sp[k].col) 
      { 
       printf("%d\t",sp[k].val); 
       k++; 
      } 
      else 
       printf("0\t"); 
     } 
     printf("\n"); 
    } 

} 
int main() 
{ 
    struct sparse sp1[10],sp2[10],sp3[10]; 
    printf("for first matrix\n"); 
    readmat(sp1); 
    printf("for second matrix\n"); 
    readmat(sp2); 
    displaymat(sp1); 
    printf("\n\n"); 
    displaymat(sp2); 
    printf("\n\n"); 
    displaymat(sp3); 
    return 0; 
}` 

回答

0

更新原來​​的答案:

原因無序值都沒有得到印刷是因爲當三重形式指向一個元素的值進一步下跌的for循環晃過所有可能已打印的其他值。例如在你的例子中,第三個元素在行= 1,col = 3,然而第二個元素在行= 2,col = 2。這將導致外部for-loop前進到第二排。在那個時候,循環將不會返回並打印第一行。

一種方法是根據行和列進行排序,然後打印值。

+0

但是當我們將數組傳遞給函數時,它是傳遞的地址,所以基本上沒有區別。也與我的問題無關。 –

+0

沒錯。再次查看您的代碼,我發現一個邏輯問題導致所有較低索引在序列中遇到較高索引時不會打印。 –

+0

是的,我也想在用戶輸入值和它的各自索引後對它們進行排序。 –