三元组顺序表表示的稀疏矩阵加法。
输入格式:
输入第1行为两个同型矩阵的行数m、列数n,矩阵A的非零元素个数t1,矩阵B的非零元素个数t2。
按行优先顺序依次输入矩阵A三元组数据,共t1行,每行3个数,分别表示非零元素的行标、列标和值。
按行优先顺序依次输入矩阵B三元组数据,共t2行,每行3个数,分别表示非零元素的行标、列标和值。
输出格式:
输出第1行为相加后矩阵行数m、列数n及非零元素个数t。
输出t行相加后的三元组顺序表结果,每行输出非零元素的行标、列标和值,每行数据之间用空格分隔。
输入样例:
4 4 3 4
0 1 -5
1 3 1
2 2 1
0 1 3
1 3 -1
3 0 5
3 3 7
输出样例:
4 4 4
0 1 -2
2 2 1
3 0 5
3 3 7
输出结果:
主要算法:
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, n = 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当前元素列号
if (A.data[count].elem + B.data[count].elem != 0)
{
C.data[count] = A.data[i];
C.data[count].elem += B.data[j].elem;
count++;
}
++i; ++j;
}
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;
}
完整代码:
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef struct {
int row, col;
int elem;
}triple;
typedef struct {
triple data[MAXSIZE + 1]; //零号元素位置弃用
int m, n, length; //矩阵的行数、列数和非零元素的个数
}TSMatrix;
void Initialise(TSMatrix& M,TSMatrix &N){ //三元表组初始化
int r, c,la,lb;
cin >> r >> c >> la>> lb;
M.m = N.m = r;
M.n = N.n = c;
M.length = la;
N.length = lb;
for (int i = 1; i <= M.length; ++i)
cin >> M.data[i].row >> M.data[i].col >> M.data[i].elem;
for(int j=1;j<=N.length;j++)
cin >> N.data[j].row >> N.data[j].col >> N.data[j].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, n = 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当前元素列号
if (A.data[count].elem + B.data[count].elem != 0)
{
C.data[count] = A.data[i];
C.data[count].elem += B.data[j].elem;
count++;
}
++i; ++j;
}
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) {
cout << M.m <<" " << M.n << " "<< M.length << endl;
for (int i = 1; i <= M.length; ++i) {
cout << M.data[i].row << " " << M.data[i].col << " " << M.data[i].elem << endl;
}
}
int main() {
TSMatrix A,B,C;
cout << "请输入稀疏矩阵A,B的行数、列数和非零元素的个数:" << endl;
Initialise(A,B);
if (!Add(A, B, C)) {
cout << "矩阵行列数不同,无法相加!";
return 0;
}
cout << "三元组表C:" << endl;
Show(C);
return 0;
}