三元組表示稀疏矩陣並相加

三元組表示稀疏矩陣並相加

一、實驗題目:

要求稀疏矩陣用三元組結構存儲,實現矩陣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");
    }
}

五、運行結果截圖

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章