直接上代码
来自陈老师的学生
#include<iostream>
using namespace std;
#define MaxSize 1000
#define MaxRow 100
int num[100];
typedef struct {
int row, col;//三元组行号、列号
int elem;
}Triple;
typedef struct {
Triple data[MaxSize + 1];//三元组表
int position[MaxRow + 1]; //各行第一个非零元的位置表
int m, n, len; //矩阵的行数、列数和非零元个数
}TSMatrix;
TSMatrix position(TSMatrix &A) {
for (int i = 1; i <= A.m; i++) {
num[i] = 0;
}
for (int j = 1; j <= A.len; j++) {
num[A.data[j].row]++;
}
A.position[1] = 1;
for (int k = 2; k <= A.m; k++) {
A.position[k] = A.position[k - 1] + num[k - 1];
}
return A;
/*for (int i = 1; i <= B.m; i++) {
num[i] = 0;
}
for (int j = 1; j <= B.len; j++) {
num[B.data[j].row]++;
}
B.position[1] = 1;
for (int k = 2; k <= B.m; k++) {
B.position[k] = B.position[k - 1] + num[k - 1];
}*/
}
int MultMatrix(TSMatrix A, TSMatrix B, TSMatrix* &C)
{
int sum[100];
int next;
int column;//A的列号
int tb;//B的行号
int Ccol;//C的列号
if (A.n != B.m) {
return 0;//不能相乘
}
C->m = A.m;
C->n = B.n;
C->len = 0;
if (A.len * B.len != 0) {
for (int arrow = 1; arrow <= A.m; arrow++) {//处理A的每一行
for (int Ccol = 1; Ccol <= C->n; Ccol++) {
sum[Ccol] = 0;//初始化每行的求和值
}
//C->position[arrow] = C->len++;//得到位置表
if (arrow < A.m) {
next = A.position[arrow + 1]; //记录下一个位置的值,用于循环
}
else {
next = A.len + 1; //记录下一个位置的值,用于循环 找到A中相同的行号
}
//开始做A矩阵的乘法,先找到A中相同的行号
for (int i = A.position[arrow]; i < next; i++) {//每一个行号对应的列号
//再找到每行的列号,去B中找行号
column = A.data[i].col;
//这边还要对B相同的行号进行循环
if (column < B.m) {
tb = B.position[column + 1];
}
else {
tb = B.len + 1;
}
//对B进行循环,并相乘
for (int ro = B.position[column]; ro < tb; ro++) {
//获取B那一行对应的列号,也就是C的列号
Ccol = B.data[ro].col;
sum[Ccol] = sum[Ccol] + A.data[i].elem * B.data[ro].elem;
}
}
//下面存储到C中
for (int c = 1; c <= C->n; c++) {
if (sum[c] != 0) {//如果sum[1]不为0的时候进行存储
if (C->len > MaxSize)return 0;
C->len++;
C->data[C->len].row = arrow;//第一行
C->data[C->len].col = c;
C->data[C->len].elem = sum[c];
}
}
}
}
return 1;
}
int main() {
TSMatrix A, B;
A.len = 0;
B.len = 0;
TSMatrix* C = new TSMatrix();
/*C->len = 0 ;
C->m = 0;
C->n = 0;
C->position[1] = 1;
C->data[0].col = 0;
C->data[0].row = 0;
C->data[0].elem = 0;*/
int m1, n1, m2, n2;
int e;
cout << "请输入A矩阵的行和列:";
int x1, y1;
cin >> x1 >> y1;
A.m = x1;
A.n = y1;
cout << "请输入B矩阵的行和列:";
int x2, y2;
cin >> x2 >> y2;
B.m = x2;
B.n = y2;
cout << "请输入A矩阵的三元组表,以(0 0 0)结束:" << endl;
for (int i = 1;; i++) {//输入矩阵
cin >> m1 >> n1 >> e;
if (m1 == 0 && n1 == 0 && e == 0) {
break;
}
A.data[i].row = m1;
A.data[i].col = n1;
A.data[i].elem = e;
A.len++;
}
cout << endl;
cout << "请输入B矩阵的三元组表,以(0 0 0)结束:" << endl;
for (int i = 1;; i++) {//输入矩阵
cin >> m2 >> n2>> e;
if (m1 == 0 && n1 == 0 && e == 0) {
break;
}
B.data[i].row = m2;
B.data[i].col = n2;
B.data[i].elem = e;
B.len++;
}
A =position(A);
B = position(B);
MultMatrix(A, B, C);
cout <<endl<< "A的三元组矩阵表:" << endl;
for (int i = 1; i <= A.len; i++) {
cout << "(" << A.data[i].row << "," << A.data[i].col << "," << A.data[i].elem << ")" << endl;
}
cout <<endl<< "B的三元组矩阵表:" << endl;
for (int i = 1; i <= B.len; i++) {
cout << "(" << B.data[i].row << "," << B.data[i].col << "," << B.data[i].elem << ")" << endl;
}
cout <<endl<< "C的三元组矩阵表:" << endl;
for (int i = 1; i <= C->len; i++) {
cout << "(" << C->data[i].row << "," << C->data[i].col << "," << C->data[i].elem << ")" << endl;
}
cout << endl << endl;
return 0;
}
运行结果