三元組表示稀疏矩陣並相加
一、實驗題目:
要求稀疏矩陣用三元組結構存儲,實現矩陣A+B=C,並採用矩陣形式顯示結果。
二、實驗思路:
定義兩個結構體,Triple結構體用來存放每一個非零元素的信息(行標,列標,數值),Tripledata用來存放兩個三元組矩陣的信息(行數,列數,非零元素的個數)。每一個三元組結構都需要調用這兩個結構體,兩個結構體共同組成一個稀疏矩陣的信息。定義兩個二維數組將所有元素賦值爲0,然後再在非零元素位置進行賦值操作,輸出打印矩陣。最後用第三個數組存放前兩個數組相加的結果。
三、流程圖解析:
主函數:
打印矩陣
矩陣相加
實驗代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct threetuple{
int x;//表示非零元素的行標
int y;//表示非零元素的列標
int value;//表示非零元的值
}Triple;//用來存放三元組中每一個非零元素的信息
typedef struct infor
{
int col;//列數
int row;//行數
int counts;//存放非零元的個數
}Tripledata;//用來存放三元組矩陣的信息
void printtuple(Triple m[],Tripledata n,int A[n.col][n.row]);
void add_print(Tripledata n,int A[n.col][n.row],int B[n.col][n.row]);
int main()
{
Tripledata t[2];//定義兩個信息結構體來存放矩陣信息
int i,j;
for(i=0;i<=1;i++)//行列數信息
{
printf("請輸入第%d個元組的信息:\n依次輸入行數,列數,非零元個數\n",i+1);
scanf("%d%d%d",&t[i].col,&t[i].row,&t[i].counts);//對非零元素進行賦值操作
}
if(t[0].col!=t[1].col||t[0].row!=t[1].row)
{
printf("該情況無法相加,程序退出");
exit(0);
}
int a,b;
a=t[0].counts;
b=t[1].counts;
Triple T1[a],T2[b];//定義兩個非零元素信息結構體,前者對應A,後者是B
printf("請輸入每個三元組矩陣的非零元素的信息:\n");
for(i=1,j=0;i<=t[0].counts;j++,i++)//每個三元組的信息;
{
printf("依次輸入元組1第%d個非零元素行標,列標,數值",i);
scanf("%d%d%d",&T1[j].x,&T1[j].y,&T1[j].value);
}
for(i=1,j=0;i<=t[0].counts;j++,i++)//每個三元組的信息;
{
printf("依次輸入元組2第%d個非零元素行標,列標,數值",i);
scanf("%d%d%d",&T2[j].x,&T2[j].y,&T2[j].value);
}
int A[t[0].col][t[0].row];//定義一個二維數組來存放矩陣信息
int B[t[1].col][t[1].row];//同上
printf("\nA的矩陣形式:");
printtuple(T1,t[0],A);//以矩陣形式打印A
printf("\nB的矩陣形式:");
printtuple(T2,t[1],B);//以矩陣形式打印B
add_print(t[0],A,B);//
return 0;
}
void printtuple(Triple m[],Tripledata n,int A[n.col][n.row])//以矩陣形式輸出兩個三元祖
{
int i,j;
for(i=0;i<n.col;i++)
{
for(j=0;j<n.row;j++)
{
A[i][j]=0;//將所有元素賦值0
}
}
for(i=0;i<n.counts;i++)
{
A[m[i].x-1][m[i].y-1]=m[i].value;//把三元組非零元素在對應位置賦值
}
for(i=0;i<n.col;i++)
{
printf("\n");
for(j=0;j<n.row;j++)
{
printf("%2d",A[i][j]);//以矩陣形式打印
}
}
}
void add_print(Tripledata n,int A[n.col][n.row],int B[n.col][n.row])
{
int i,j;
int C[n.col][n.row];//定義一個新矩陣用來存儲相加後的結果。
printf("\n執行矩陣相加,並打印結果:\n");
for(i=0;i<n.col;i++)
{
for(j=0;j<n.row;j++)
{
C[i][j]=A[i][j]+B[i][j];//進行矩陣相加運算
printf("%-3d",C[i][j]);//相加和打印同時進行
}
printf("\n");
}
}
五、運行結果截圖