//思路:除了三元组结构体的定义和一些基本操作外,主要的就是实现函数SpmAdd(Spmatrix *a,Spmatrix *b,Spmatrix *c)。
//实现的思想和将两个递增数组归并到第三个数组上,第三个数组也是递增排列的算法思想相同。
//分别用j,j1,j2指向数组c,a,b的当前数据元素。通过比较行列的大小以行为主列为辅进行插入到数组c中,如果j1,j2所指向的行和列都相同则两者的值相加,若结果不为零则插入,否则不插入。
#include<iostream>
using namespace std;
#define MAXSIZE 20
typedef struct{
int i;
int j;
int v;
}node;
typedef struct{
int m,n,t;
node data[MAXSIZE];
}Spmatrix;
void SpmInit(Spmatrix *s){
int i;
cout<<"请输入矩阵行数列数和非零元素个数:";
cin>>s->m>>s->n>>s->t;
cout<<"输入三元组数据:";
for(i=0;i<s->t;i++)
cin>>s->data[i].i>>s->data[i].j>>s->data[i].v;
}
void SpmAdd(Spmatrix *a,Spmatrix *b,Spmatrix *c){
int i;
int j=0,j1=0,j2=0;//分别指向c,a,b的当前数据元素
c->m=a->m;
c->n=a->n;
c->t=a->t+b->t;
for(i=0;i<c->t;i++)
{
if(j1>a->t&&j2<b->t){
c->data[j]=b->data[j2];
j2++;
}
else if(j1<a->t&&j2>b->t){
c->data[j]=a->data[j1];
j1++;
}
else if(j1<a->t&&j2<b->t){
if(a->data[j1].i<b->data[j2].i){
c->data[j]=a->data[j1];
j1++;
}
else if(a->data[j1].i>b->data[j2].i){
c->data[j]=b->data[j2];
j2++;
}
else if(a->data[j1].j>b->data[j2].j){
c->data[j]=b->data[j2];
j2++;
}
else if(a->data[j1].j<b->data[j2].j){
c->data[j]=a->data[j1];
j1++;
}
else {
if(a->data[j1].v+b->data[j2].v){
c->data[j].i=a->data[j1].i;
c->data[j].j=a->data[j1].j;
c->data[j].v=a->data[j1].v+b->data[j2].v;
j1++;
j2++;
}
else {
j1++;
j2++;
continue;
}
}
}
j++;
}
c->t=j;
}
void print(Spmatrix *s){
int i;
for(i=0;i<s->t;i++)
cout<<s->data[i].i<<' '<<s->data[i].j<<' '<<s->data[i].v<<endl;
}
int main(){
Spmatrix *a,*b,*c;
a=(Spmatrix *)malloc(sizeof(Spmatrix));
b=(Spmatrix *)malloc(sizeof(Spmatrix));
c=(Spmatrix *)malloc(sizeof(Spmatrix));
SpmInit(a);
SpmInit(b);
SpmInit(c);
SpmAdd(a,b,c);
print(c);
return 0;
}
//实现的思想和将两个递增数组归并到第三个数组上,第三个数组也是递增排列的算法思想相同。
//分别用j,j1,j2指向数组c,a,b的当前数据元素。通过比较行列的大小以行为主列为辅进行插入到数组c中,如果j1,j2所指向的行和列都相同则两者的值相加,若结果不为零则插入,否则不插入。
#include<iostream>
using namespace std;
#define MAXSIZE 20
typedef struct{
int i;
int j;
int v;
}node;
typedef struct{
int m,n,t;
node data[MAXSIZE];
}Spmatrix;
void SpmInit(Spmatrix *s){
int i;
cout<<"请输入矩阵行数列数和非零元素个数:";
cin>>s->m>>s->n>>s->t;
cout<<"输入三元组数据:";
for(i=0;i<s->t;i++)
cin>>s->data[i].i>>s->data[i].j>>s->data[i].v;
}
void SpmAdd(Spmatrix *a,Spmatrix *b,Spmatrix *c){
int i;
int j=0,j1=0,j2=0;//分别指向c,a,b的当前数据元素
c->m=a->m;
c->n=a->n;
c->t=a->t+b->t;
for(i=0;i<c->t;i++)
{
if(j1>a->t&&j2<b->t){
c->data[j]=b->data[j2];
j2++;
}
else if(j1<a->t&&j2>b->t){
c->data[j]=a->data[j1];
j1++;
}
else if(j1<a->t&&j2<b->t){
if(a->data[j1].i<b->data[j2].i){
c->data[j]=a->data[j1];
j1++;
}
else if(a->data[j1].i>b->data[j2].i){
c->data[j]=b->data[j2];
j2++;
}
else if(a->data[j1].j>b->data[j2].j){
c->data[j]=b->data[j2];
j2++;
}
else if(a->data[j1].j<b->data[j2].j){
c->data[j]=a->data[j1];
j1++;
}
else {
if(a->data[j1].v+b->data[j2].v){
c->data[j].i=a->data[j1].i;
c->data[j].j=a->data[j1].j;
c->data[j].v=a->data[j1].v+b->data[j2].v;
j1++;
j2++;
}
else {
j1++;
j2++;
continue;
}
}
}
j++;
}
c->t=j;
}
void print(Spmatrix *s){
int i;
for(i=0;i<s->t;i++)
cout<<s->data[i].i<<' '<<s->data[i].j<<' '<<s->data[i].v<<endl;
}
int main(){
Spmatrix *a,*b,*c;
a=(Spmatrix *)malloc(sizeof(Spmatrix));
b=(Spmatrix *)malloc(sizeof(Spmatrix));
c=(Spmatrix *)malloc(sizeof(Spmatrix));
SpmInit(a);
SpmInit(b);
SpmInit(c);
SpmAdd(a,b,c);
print(c);
return 0;
}