数据结构 数组操作 稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。

不解释,请看注释,代码如下:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAX 12500 
typedef int Type;

typedef struct{
	int i,j;
	Type e;
}T;

typedef struct{
	T data[MAX+1];
	int m,n,count;	
}S;

int main()
{
	S a,b,ans;
	a.count=0;b.count=0;ans.count=0;
	int c;
	printf("请输入矩阵的行数和列数\n");
	cin>>a.m>>a.n;
	printf("请输入矩阵a\n");
	for(int i=1;i<=a.m;i++)
	{
		for(int j=1;j<=a.n;j++)
		{
			cin>>c;
			if(c!=0)
			{
				a.count++;
				a.data[a.count].e=c;
				a.data[a.count].i=i;
				a.data[a.count].j=j;
			}
		}
	}
	b.m=a.m;b.n=a.n;
	printf("请输入矩阵b\n");
	for(int i=1;i<=b.m;i++)
	{
		for(int j=1;j<=b.n;j++)
		{
			cin>>c;
			if(c!=0)
			{
				b.count++;			
				b.data[b.count].e=c;
				b.data[b.count].i=i;
				b.data[b.count].j=j;
			}
		}
	}
	printf("合并前的a\n");
	for(int i=1;i<=a.count;i++)
	{
		printf("i=%d j=%d e=%d\n",a.data[i].i,a.data[i].j,a.data[i].e);
	}
	printf("合并前的b\n");
	for(int i=1;i<=a.count;i++)
	{
		printf("i=%d j=%d e=%d\n",b.data[i].i,b.data[i].j,b.data[i].e);
	}
	int aa,bb;
	aa=bb=1;
	for(int i=1;i<=b.m;i++)
	{
		for(int j=1;j<=b.n;j++)
		{ 
			if(a.data[aa].i==i && a.data[aa].j==j && (b.data[bb].i!=i || b.data[bb].j!=j))	//a的横纵坐标均匹配且b的横纵坐标有一个不匹配
			{
				ans.count++;
				ans.data[ans.count].e=a.data[aa].e;
				ans.data[ans.count].i=a.data[aa].i;
				ans.data[ans.count].j=a.data[aa].j;
				aa++;
			}
			else if( b.data[bb].i==i && b.data[bb].j==j && (a.data[aa].i!=i || a.data[aa].j!=j))	//b的横纵坐标都匹配且a的不完全匹配
			{
				ans.count++;
				ans.data[ans.count].e=b.data[bb].e;
				ans.data[ans.count].i=b.data[bb].i;
				ans.data[ans.count].j=b.data[bb].j;
				bb++;
			}
			else if(b.data[bb].i==i && b.data[bb].j==j && a.data[aa].i==i && a.data[aa].j==j)	//ab均匹配
			{
				if(b.data[bb].e+a.data[aa].e!=0)
				{
					ans.count++;
					ans.data[ans.count].e=b.data[bb].e+a.data[aa].e;
					ans.data[ans.count].i=b.data[bb].i;
					ans.data[ans.count].j=b.data[bb].j;
					aa++;
					bb++;
				}
				else
				{
					aa++;
					bb++;
				} 
			}
		}
	}
	printf("合并后\n");
	for(int i=1;i<=ans.count;i++)
	{
		printf("i=%d j=%d e=%d\n",ans.data[i].i,ans.data[i].j,ans.data[i].e);
	}
	return 0;
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值