不解释,请看注释,代码如下:
#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;
}