题目:
实现使用三元组表存储的稀疏矩阵的加法
代码:
#include<iostream>
using namespace std;
const int MAXSIZE=1000;
typedef struct{
int row,col;
int elem; //假设非零元素为整型
}triple;
typedef struct{
triple data[MAXSIZE+1]; //零号元素位置弃用
int m,n,length; //矩阵的行数、列数和非零元素的个数
}TSMatrix;
TSMatrix A,B,C;
void initialise(TSMatrix &M){ //三元表组初始化
cin>>M.m>>M.n>>M.length;
cout<<"请依次输入"<<M.length<<"个三元组表元素:"<<endl;
for(int i=1;i<=M.length;++i)
cin>>M.data[i].row>>M.data[i].col>>M.data[i].elem;
}
bool add(TSMatrix A,TSMatrix B,TSMatrix &C){ //三元表组相加
if(A.m!=B.m||A.n!=B.n) //两个矩阵只有行列数相同才可以相加
return false;
C.m=A.m;
C.n=A.n;
int i=1,j=1,count=1;
while(i<=A.length&&j<=B.length){
if(A.data[i].row==B.data[j].row){ //矩阵A当前元素行号等于矩阵B当前元素行号
if(A.data[i].col==B.data[j].col){ //矩阵A当前元素列号等于矩阵B当前元素列号
C.data[count]=A.data[i];
C.data[count].elem+=B.data[j].elem;
++i;++j;++count;
}else if(A.data[i].col<B.data[j].col){ //矩阵A当前元素列号小于矩阵B当前元素列号
C.data[count]=A.data[i];
++i;++count;
}else if(A.data[i].col>B.data[j].col){ //矩阵A当前元素列号大于矩阵B当前元素列号
C.data[count]=B.data[j];
++j;++count;
}
}else if(A.data[i].row<B.data[j].row){ //矩阵A当前元素行号小于矩阵B当前元素行号
C.data[count]=A.data[i];
++i;++count;
}else if(A.data[i].row>B.data[j].row){ //矩阵A当前元素行号大于矩阵B当前元素行号
C.data[count]=B.data[j];
++j;++count;
}
}
while(i<=A.length){
C.data[count]=A.data[i];
++i;++count;
}
while(j<=B.length){
C.data[count]=B.data[j];
++j;++count;
}
C.length=--count;
return true;
}
void show(TSMatrix M){
for(int i=1;i<=M.length;++i){
cout<<M.data[i].row<<" "<<M.data[i].col<<" "<<M.data[i].elem<<endl;
}
}
int main(){
cout<<"请输入稀疏矩阵A的行数、列数和非零元素的个数:"<<endl;
initialise(A);
cout<<"请输入稀疏矩阵B的行数、列数和非零元素的个数:"<<endl;
initialise(B);
if(!add(A,B,C)){
cout<<"矩阵行列数不同,无法相加!";
return 0;
}
cout<<"三元组表C:"<<endl;
show(C);
return 0;
}