#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 12500
int a[100][100];
typedef struct{
int i,j;
int e;
}Triple;
typedef struct{
Triple data[MAXSIZE];
int mu,nu,tu;
}TSMatrix;
void InitArray(int m, int n){
//初始化矩阵,输入矩阵中的各个元素
printf("please input the Array:\n");
for(int i = 0; i < m; i ++)
for(int j = 0; j < n; j ++)
scanf("%d",&a[i][j]);
}
void Memory(TSMatrix &T, int m, int n){//把矩阵中的非零元素采用三元组方法存储
int i, j;
T.mu = m; T.nu = n; T.tu = 0;
for(i = 0; i < m; i ++){
for(j = 0; j < n; j ++){
if(a[i][j]){
T.data[T.tu].i = i; T.data[T.tu].j = j; T.data[T.tu].e = a[i][j];
T.tu ++;
}
}
}
}
void AddTSMatrix(TSMatrix T, TSMatrix S, TSMatrix &M){//求和
int i = 0, j = 0;
M.tu = 0;
while(i < T.tu && j < S.tu){
//分三大种情况讨论,相等时再分三种情况讨论
if(T.data[i].i == S.data[j].i){
if(T.data[i].j <= S.data[j].j){
M.data[M.tu].i = T.data[i].i; M.data[M.tu].j = T.data[i].j;
if(T.data[i].j < S.data[j].j)
M.data[M.tu].e = T.data[i].e;
else{
if(T.data[i].e + S.data[j].e){
M.data[M.tu].e = T.data[i].e + S.data[j].e;
}
else
M.tu --;
j ++;
}
i ++;
}
else{
M.data[M.tu].i = S.data[j].i; M.data[M.tu].j = S.data[j].j; M.data[M.tu].e = S.data[j].e;
j ++;
}
}
else if(T.data[i].i < S.data[j].i){
M.data[M.tu].i = T.data[i].i; M.data[M.tu].j = T.data[i].j; M.data[M.tu].e = T.data[i].e;
i ++;
}
else{
M.data[M.tu].i = S.data[j].i; M.data[M.tu].j = S.data[j].j; M.data[M.tu].e = S.data[j].e;
j ++;
}
M.tu ++;
}
while(i < T.tu){
M.data[M.tu].i = T.data[i].i; M.data[M.tu].j = T.data[i].j; M.data[M.tu].e = T.data[i].e;
i ++;
M.tu ++;
}
while(j < S.tu){
M.data[M.tu].i = S.data[j].i; M.data[M.tu].j = S.data[j].j; M.data[M.tu].e = S.data[j].e;
j ++;
M.tu ++;
}
}
void Output(TSMatrix M){//输出三元组中存储的数据
int i;
printf("row col value\n");
for(i = 0; i < M.tu; i ++){
printf("%d %d %d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
}
int main(){
TSMatrix T,S,M;
int m,n;
printf("please input the col and row:\n");
scanf("%d%d",&m,&n);
InitArray(m,n);
Memory(T,m,n);
InitArray(m,n);
Memory(S,m,n);
AddTSMatrix(T,S,M);
Output(M);
return 0;
}