**
6-1 稀疏矩阵求和 (70 分)
**
本题实现稀疏矩阵的求和运算。
函数接口定义:
int add_mat(elem a[],int t1,elem b[],int t2, elem c[]);//求a+b
其中 t1 和 t2 表示稀疏矩阵a的长度和稀疏矩阵b的长度,函数返回a+b的长度。
裁判测试程序样例:
#include <stdio.h>
#define M 10 //行
#define N 10 //列
typedef struct
{ int row, col; //行号、列号
int val;
}elem;
void input(elem a[],int m);
void show_mat(elem a[],int n);
int add_mat(elem a[],int t1,elem b[],int t2, elem c[]);
void input(elem a[],int m)
{
int i;
for(i=0;i<m;i++)
scanf("%d%d%d",&a[i].row,&a[i].col,&a[i].val);
}
void show_mat(elem a[],int n)//输出
{
int i;
for(i=0;i<n;i++)
printf("%d %d %d\n",a[i].row,a[i].col,a[i].val);
}
int main()
{
int t,m,n;
elem a[M*N],b[N*M],c[N*M];
scanf("%d%d",&m,&n);
input(a,m);
input(b,n);
t=add_mat(a,m,b,n,c);//c=a+b
show_mat(c,t);
return 0;
}
/* 请在这里填写答案 */
输入样例:
第一行为矩阵行和列,接下来为两个矩阵
3 2
0 0 1
0 1 3
2 1 2
0 1 -3
1 1 2
//结尾无空行
输出样例:
0 0 1
1 1 2
2 1 2
//结尾无空行
/* 请在这里填写答案 */
int add_mat(elem a[],int t1,elem b[],int t2, elem c[]){
int s=0,i=0,j=0,k=0;
while(i!=t1||j!=t2){
if(i<t1&&j<t2){
if(a[i].row<b[j].row){//稀疏矩阵a的行号小于b,将a的项存入c中
c[k].row=a[i].row;
c[k].col=a[i].col;
c[k].val=a[i].val;
i++;
k++;
}
else if(a[i].row>b[j].row){//稀疏矩阵a的行号大于b,将b的项存入c中
c[k].row=b[j].row;
c[k].col=b[j].col;
c[k].val=b[j].val;
j++;
k++;
}
else if(a[i].row==b[j].row){//稀疏矩阵的行号相等
if(a[i].col<b[i].col){//稀疏矩阵a的列号小于b,将a的项存入c中
c[k].row=a[i].row;
c[k].col=a[i].col;
c[k].val=a[i].val;
i++;
k++;
}
else if(a[i].col>b[j].col){//稀疏矩阵a的列号大于b,将a的项存入c中
c[k].row=b[j].row;
c[k].col=b[j].col;
c[k].val=b[j].val;
j++;
k++;
}
else{//稀疏矩阵的列号相等
if(b[j].val+a[i].val!=0){
c[k].row=b[j].row;
c[k].col=b[j].col;
c[k].val=b[j].val+a[i].val;
i++;
j++;
k++;
}
else{
i++;
j++;
}
}
}
}
else if(i==t1&&j!=t2){
c[k].row=b[j].row;
c[k].col=b[j].col;
c[k].val=b[j].val;
j++;
k++;
}
else if(i!=t1&&j==t2){
c[k].row=a[i].row;
c[k].col=a[i].col;
c[k].val=a[i].val;
i++;
k++;
}
}
return k;
}