三元组顺序表表示的稀疏矩阵加法(数据结构)

三元组顺序表表示的稀疏矩阵加法。

输入格式:

输入第1行为两个同型矩阵的行数m、列数n,矩阵A的非零元素个数t1,矩阵B的非零元素个数t2。
按行优先顺序依次输入矩阵A三元组数据,共t1行,每行3个数,分别表示非零元素的行标、列标和值。
按行优先顺序依次输入矩阵B三元组数据,共t2行,每行3个数,分别表示非零元素的行标、列标和值。

输出格式:

输出第1行为相加后矩阵行数m、列数n及非零元素个数t。
输出t行相加后的三元组顺序表结果,每行输出非零元素的行标、列标和值,每行数据之间用空格分隔。

输入样例1:

4 4 3 4
0 1 -5
1 3 1
2 2 1
0 1 3
1 3 -1
3 0 5
3 3 7

输出样例1:

4 4 4
0 1 -2
2 2 1
3 0 5
3 3 7

#include<bits/stdc++.h>
using namespace std;
typedef struct{
    int i,j,v;
}triple;
typedef struct{
    triple data[10000];
    int m,n,t;
}matrix;
int main(){
    matrix m1,m0,m2;
    cin>>m1.m>>m1.n>>m1.t>>m2.t;
    m2.m=m1.m;m2.n=m1.n;
    for(int a=0;a<m1.t;a++){
        cin>>m1.data[a].i>>m1.data[a].j>>m1.data[a].v;
    }
    for(int b=0;b<m2.t;b++){
        cin>>m2.data[b].i>>m2.data[b].j>>m2.data[b].v;
    }
    int index=0,a=0,b=0;
    while(a<m1.t&&b<m2.t){
        if(m1.data[a].i<m2.data[b].i) m0.data[index++]=m1.data[a++];
        else if(m1.data[a].i>m2.data[b].i) m0.data[index++]=m1.data[b++];
        else if(m1.data[a].j<m2.data[b].j) m0.data[index++]=m1.data[a++];
        else if(m1.data[a].j>m2.data[b].j) m0.data[index++]=m1.data[b++];
        else{
            m1.data[a].v+=m2.data[b].v;
            if(m1.data[a].v) m0.data[index++]=m1.data[a];
            a++;b++;
        }
    }
    for(int i=a;i<m1.t;i++) m0.data[index++]=m1.data[i];
    for(int i=b;i<m2.t;i++) m0.data[index++]=m2.data[i];
    cout<<index<<" "<<m1.m<<" "<<m1.n<<endl;
    for(int i=0;i<index;i++){
        cout<<m0.data[i].i<<" "<<m0.data[i].j<<" "<<m0.data[i].v<<endl;
    }
    return 0;
}
  1. #include<bits/stdc++.h>:这是一个预处理指令,用于包含C++标准库的所有头文件。

  2. using namespace std;:这是一个命名空间的声明,允许你直接使用标准库的元素,而不需要在前面加上 std:: 前缀。

  3. typedef struct { int i, j, v; } triple;:这里定义了一个名为triple的结构体,包含三整数成员ijv,用于表示三元组 (i, j, v)。

  4. typedef struct { triple data[10000]; int m, n, t; } matrix;:定义了一个名为matrix的结构体,包含一个data数组,用于存储三元组,以及两个整数成员mn,分别表示矩阵的行数和列数,还有整数成员t,表示矩阵中非零元素的数量。

  5. matrix m1, m0, m2;:定义了三个matrix类型的变量m1m0m2,分别表示两个输入矩阵和一个输出矩阵。

  6. cin >> m1.m >> m1.n >> m1.t >> m2.t;:从标准输入中读取四个整数,分别为m1的行数、列数、非零元素数量,以及m2的非零元素数量。

  7. m2.m = m1.m; m2.n = m1.n;:将m2的行数和列数设置为与m1相同。

  8. 使用循循环读取m1m2中的三元组数据,分别存储到m1.datam2.data中。

  9. int index = 0, a = 0, b = 0;:定义了三个整数变量,index用于跟踪输出矩阵m0中的三元组数量,ab用于跟踪m1m2中的三元组的索引。

  10. 进入一个while循环,循环条件是a小于m1.tb小于m2.t,表示遍历m1m2中的三元组。

  11. 在循环中,首先检查当前m1m2中的三元组的ij值,以确定如何合并这两个三元组,或者将它们中的一个放入输出矩阵m0

  12. 如果 m1.data[a].i < m2.data[b].i,则将m1中的三元组加入到m0,并递增aindex

  13. 如果 m1.data[a].i > m2.data[b].i,则将m2中的三元组加入到m0,并递增bindex

  14. 如果 m1.data[a].i == m2.data[b].i,则比较它们的j值,以确定如何合并或添加到m0

  15. 如果 m1.data[a].j < m2.data[b].j,则将m1中的三元组加入到m0,并递增aindex

  16. 如果 m1.data[a].j > m2.data[b].j,则将m2中的三元组加入到m0,并递增bindex

  17. 如果 m1.data[a].j == m2.data[b].j,则表示两个三元组具有相同的ij值,需要将它们的v值相加,然后判断相加后的值是否非零。如果非零,将结果三元组加入到m0,并递增abindex

  18. 最后,处理任何未处理的三元组,将它们加入到m0中。

  19. 输出m0的行数、列数和非零元素数量,然后遍历m0.data数组,输出合并后的三元组信息。

这段代码实现了稀疏矩阵的加法,将两个输入矩阵m1m2相加,结果存储在m0中,并输出合并后的稀疏矩阵信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值