三元组表示稀疏矩阵并相加

三元组表示稀疏矩阵并相加

一、实验题目:

要求稀疏矩阵用三元组结构存储,实现矩阵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");
    }
}

五、运行结果截图

在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
三元组稀疏矩阵是指矩阵中大部分元素为0,只有少部分元素非0。为了节约内存空间和降低计算成本,通常只将非零元素存储在矩阵中,采用三元组的方式。 三元组采用三个一维数组来表示,分别存储非零元素的行、列、和值,具体定义如下: ```c++ struct Triple { int row, col; // 行和列 ElemType value; // 元素值 }; ``` 矩阵的相加可以按照以下方法: ```c++ STATUS MatrixAdd(TSMatrix M, TSMatrix N, TSMatrix &Q) { // 判断两个矩阵是否可以相加 if (M.rows != N.rows || M.cols != N.cols) return ERROR; int m = 1, n = 1, k = 0; // 分别指向M、N、Q的当前元素 Q.rows = M.rows; Q.cols = M.cols; Q.nums = 0; // Q中实际存储的非零元素个数 while (m <= M.nums && n <= N.nums) { // 当前元素在M和N中的行和列不同时,按序号小的为当前元素 if (M.data[m].row < N.data[n].row || (M.data[m].row == N.data[n].row && M.data[m].col < N.data[n].col)) { Q.data[++k] = M.data[m]; m++; } else if (M.data[m].row > N.data[n].row || (M.data[m].row == N.data[n].row && M.data[m].col > N.data[n].col)) { Q.data[++k] = N.data[n]; n++; } else { // 当前元素在M和N中的行和列相同 Q.data[++k] = M.data[m]; Q.data[k].value += N.data[n].value; // 直接相加 m++; n++; } } // 将M或N中剩余的元素插入Q中 while (m <= M.nums) Q.data[++k] = M.data[m++]; while (n <= N.nums) Q.data[++k] = N.data[n++]; Q.nums = k; // 设置Q中实际存储的非零元素个数 return OK; } ``` 矩阵的转置可以按照以下方法: ```c++ STATUS MatrixTranspose(TSMatrix M, TSMatrix &T) { T.rows = M.cols; T.cols = M.rows; T.nums = M.nums; if (T.nums == 0) // M中没有非零元素 return OK; int num[M.cols + 1] = {0}; // 存储每一列的非零元素个数 for (int k = 1; k <= M.nums; k++) num[M.data[k].col]++; int cpot[M.cols + 1] = {0}; // 存储每一列在T中的起始位置 for (int i = 2; i <= M.cols; i++) cpot[i] = cpot[i - 1] + num[i - 1]; for (int k = 1; k <= M.nums; k++) { int j = M.data[k].col; // 获取M中的列 int q = cpot[j]; // 获取T中的位置 T.data[q].row = M.data[k].col; T.data[q].col = M.data[k].row; T.data[q].value = M.data[k].value; cpot[j]++; // 将T中当前列的位置向后移动一位 } return OK; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值