7-4 稀疏矩阵加法 (20分)_数据结构实验4_羊卓的杨

7-4 稀疏矩阵加法 (20分)

给定两个矩阵A和B,求其和矩阵C=A+B。

输入格式:

第一行包含两个数Row和Col,分别表示矩阵的行数和列数,A和B的维度是一致的。

第二行只有一个数N​1​​,表示接下来要输入的A中的非零元素的个数。

接下来是N​1​​行,每一行都是i j A[i,j] 这样的形式,表示的A中第i行第j列的元素A[i,j],为了与大多数编程语言保持一致,它们都是从零开始的,也就是说下标的有效范围是[0,Row−1]×[0,Col−1]。

在N​1​​行之后,是一个数N​2​​,表示矩阵B中非零元素的数量,此后N​2​​行描述B中的非零元素,它们与此前描述A中非零元素的形式一致。

矩阵元素的输入均遵循行主序。这里的所有的输入均可用int类型正确表示,可以假设输入均是合法的。

输出格式:

第一行输出和矩阵C=A+B中的绝对值大于0.1的元素个数N​3​​,此后是N​3​​行,按照行主序输出其中的非零元素,依次是行、列的下标和对应的元素。

输入样例:

2 2
1
1 1 1
1
0 0 1

输出样例:

2
0 0 1
1 1 1

答案样例:

        本题想要考察三元组。首先要知道三元组如何表示,如何赋值。然后将两个三元组进行加法操作,再将题目要求的答案输出即可。

#include <iostream>
using namespace std;
typedef struct{
	int row, col;
	double w;
} Triple;
typedef struct{
	Triple data[10000];
	int n, m, num;
} TSMatrix, *PTSMatrix;
void Enter_Triple(PTSMatrix p, int row, int col, double w){//三元组元素添加函数
	p->data[p->num].row = row;
	p->data[p->num].col = col;
	p->data[p->num].w = w;
	p->num++;
}
void Add_Triple(PTSMatrix A, PTSMatrix B, PTSMatrix C){//执行加法运算 
	int i=0, j=0;
	while(i<A->num && j<B->num){
		if(A->data[i].row < B->data[j].row){//如果A的行号小则A入C 
			Enter_Triple(C, A->data[i].row, A->data[i].col, A->data[i].w);
			i++;
		}
		else if(A->data[i].row > B->data[j].row){//如果B的行号小则A入C
			Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w);
			j++;
		}
		else if(A->data[i].row = B->data[j].row){//如果AB行号相等则开始比较列号 
			if(A->data[i].col < B->data[j].col){//如果A的列号较小则A入C 
				Enter_Triple(C, A->data[i].row, A->data[i].col, A->data[i].w);
				i++;
			}
            else if(A->data[i].col > B->data[j].col){//如果B的列号小则A入C 
            	Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w);
            	j++;
			}
            else{
                if(B->data[j].w + A->data[i].w != 0)//如果列号也相等那就算一下它们的和,若是0那就不入了 
                    Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w+A->data[i].w);
                i++;
                j++;
            }
		}
	}
	while(i < A->num){//如果A还有剩余的数,那就全部加入C 
		Enter_Triple(C, A->data[i].row, A->data[i].col, A->data[i].w);
		i++;
	}
	while(j < B->num){//如果B还有剩余的数,那就全部加入C
		Enter_Triple(C, B->data[j].row, B->data[j].col, B->data[j].w);
		j++;
	}
}
int Row, Col, N1, N2, cnt;
int main(){
	TSMatrix A, B, C;
	A.num = 0;
	B.num = 0;
	C.num = 0;
	cin >> Row >> Col >> N1;
	int x, y;
	double w;
	for(int i=0; i<N1; i++){
		cin >>x >> y >> w;
		Enter_Triple(&A, x, y, w);
	}
	cin >> N2;
	for(int i=0; i<N2; i++){
		cin >>x >> y >> w;
		Enter_Triple(&B, x, y, w);
	}
	Add_Triple(&A, &B, &C);
	for(int i=0; i<C.num; i++){
		if(C.data[i].w > 0.1)
			cnt++;
	}
	cout << cnt << endl;
	for(int i=0; i<C.num; i++)
		if(C.data[i].w > 0.1)
			cout << C.data[i].row << " " << C.data[i].col << " " << C.data[i].w << endl;
	return 0;
}

        来都来了点个赞再走呗,一键三个连也行 ~ ,可以点下方链接进入我的bilibili主页转转,也可以关注我的个人公众号~后期公众号会发送一些比较好玩的东西
bilibili:羊卓的杨
公众号:羊卓的杨

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值