详解使用三元组表存储的稀疏矩阵的加法——C++

题目:

实现使用三元组表存储的稀疏矩阵的加法

代码:

#include<iostream>
using namespace std;

const int MAXSIZE=1000;

typedef struct{
	int row,col;
	int elem;		//假设非零元素为整型 
}triple;

typedef struct{
	triple data[MAXSIZE+1];		//零号元素位置弃用
	int m,n,length;				//矩阵的行数、列数和非零元素的个数 
}TSMatrix;

TSMatrix A,B,C;

void initialise(TSMatrix &M){		//三元表组初始化 
	cin>>M.m>>M.n>>M.length;
	cout<<"请依次输入"<<M.length<<"个三元组表元素:"<<endl; 
	for(int i=1;i<=M.length;++i)
		cin>>M.data[i].row>>M.data[i].col>>M.data[i].elem;
}

bool add(TSMatrix A,TSMatrix B,TSMatrix &C){	//三元表组相加 
	if(A.m!=B.m||A.n!=B.n)		//两个矩阵只有行列数相同才可以相加
		return false;
	C.m=A.m;
	C.n=A.n;
	int i=1,j=1,count=1;
	while(i<=A.length&&j<=B.length){
		if(A.data[i].row==B.data[j].row){			//矩阵A当前元素行号等于矩阵B当前元素行号 
			if(A.data[i].col==B.data[j].col){		//矩阵A当前元素列号等于矩阵B当前元素列号 
				C.data[count]=A.data[i];
				C.data[count].elem+=B.data[j].elem;
				++i;++j;++count;
			}else if(A.data[i].col<B.data[j].col){	//矩阵A当前元素列号小于矩阵B当前元素列号 
				C.data[count]=A.data[i];
				++i;++count;
			}else if(A.data[i].col>B.data[j].col){	//矩阵A当前元素列号大于矩阵B当前元素列号 
				C.data[count]=B.data[j];
				++j;++count;
			}
		}else if(A.data[i].row<B.data[j].row){		//矩阵A当前元素行号小于矩阵B当前元素行号 
			C.data[count]=A.data[i];
			++i;++count;
		}else if(A.data[i].row>B.data[j].row){		//矩阵A当前元素行号大于矩阵B当前元素行号 
			C.data[count]=B.data[j];
			++j;++count;
		}
	}
	while(i<=A.length){
		C.data[count]=A.data[i];
		++i;++count;
	}
	while(j<=B.length){
		C.data[count]=B.data[j];
		++j;++count;
	}
	C.length=--count;
	return true;
}

void show(TSMatrix M){
	for(int i=1;i<=M.length;++i){
		cout<<M.data[i].row<<" "<<M.data[i].col<<" "<<M.data[i].elem<<endl;
	}
}
 
int main(){
	cout<<"请输入稀疏矩阵A的行数、列数和非零元素的个数:"<<endl;
	initialise(A);
	cout<<"请输入稀疏矩阵B的行数、列数和非零元素的个数:"<<endl;
	initialise(B);
	if(!add(A,B,C)){
		cout<<"矩阵行列数不同,无法相加!";
		return 0; 
	}
	cout<<"三元组表C:"<<endl;
	show(C); 
	return 0;
}

运行结果:

在这里插入图片描述

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枯木何日可逢春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值