// aaa.h //
#include<iostream>
using namespace std;
typedef struct
{
int i,j,e;
}Triple;
typedef struct
{
Triple data[30];
int mu,nu,tu;
}TSMtatrix;
TSMtatrix Init(TSMtatrix &M)//初始化三元组顺序表
{
M.mu=5;M.nu=5;M.tu=0;
M.data[0].i=0;M.data[0].j=0;M.data[0].e=1;
return M;
}
TSMtatrix houyi(TSMtatrix &M,int k)//把三元组顺序表从 M.tu-k+1 位置开始向后移位
{
M.tu++;
int test=M.tu;
for(int w=1;w<=k;w++){
M.data[test]=M.data[test-1];
test--;
}
return M;
}
TSMtatrix qianyi(TSMtatrix &M,int k)//把三元组顺序表从 M.tu-k 位置开始向前移位
{
int test=M.tu;
for(int w=0;w<k;w++)
M.data[M.tu-k+w]=M.data[M.tu-k+w+1];
M.tu--;
return M;
}
void out(TSMtatrix M)//输出三元组顺序表
{
for(int i=1;i<=M.tu;i++){
cout<<M.data[i].i<<" "<<M.data[i].j<<" "<<M.data[i].e<<endl;
}
}
// aaa.cpp //
#include"aaa.h"
void main()
{
int A[5][5]={
{0,0,3,0,0},
{5,0,0,6,0},
{3,0,0,0,0},
{0,7,0,0,4},
{0,0,0,1,0},
};
int B[5][5]={
{0,3,0,0,0},
{-5,0,6,0,0},
{8,0,0,0,0},
{0,2,0,7,0},
{0,0,1,0,4},
};
TSMtatrix M,N,R;
Init(M);Init(N);Init(R);
//M.tu++;N.tu++;R.tu++;
int t1=1,t2=1;
for(int i=0;i<M.mu;i++)
for(int j=0;j<M.nu;j++){
if(A[i][j]!=0){
M.tu++;
M.data[M.tu].i=i;
M.data[M.tu].j=j;
M.data[M.tu].e=A[i][j];
}
if(B[i][j]!=0){
N.tu++;
N.data[N.tu].i=i;
N.data[N.tu].j=j;
N.data[N.tu].e=B[i][j];
}
}
for(i=1;i<=M.tu;i++){
R.tu++;
R.data[R.tu]=M.data[i];
}
cout<<"矩阵M的三元组顺序表为:\n";out(M);
cout<<"矩阵N的三元组顺序表为:\n";out(N);
for(i=1;i<=N.tu;i++){
for(int j=1;j<=R.tu;j++){
if(R.data[j].i==N.data[i].i && R.data[j].j==N.data[i].j){
R.data[j].e+=N.data[i].e;//如果有两元素位置相同的的,就直接相加
}
if(R.data[j].i==N.data[i].i && R.data[j].j>N.data[i].j || R.data[j].i>N.data[i].i)
if(R.data[j-1].i==N.data[i].i && R.data[j-1].j<N.data[i].j || R.data[j-1].i<N.data[i].i){
houyi(R,R.tu+1-j);//如果有两元素位置相同不同,就向后移一位,插入新的元素
R.data[j]=N.data[i];
}
}
if(R.data[R.tu].i==N.data[i].i && R.data[R.tu].j<N.data[i].j || R.data[R.tu].i<N.data[i].i){
R.tu++;
R.data[R.tu]=N.data[i];
}
}
for(int j=1;j<=R.tu;j++)
if(R.data[j].e==0)
qianyi(R,R.tu-j);//如果有两元素相加为零的,就向前移一位
cout<<"矩阵M+N的三元组顺序表为:\n";out(R);
}