#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define Max 100
using namespace std;
struct node
{
int i;//行标
int j;//列标
int v;//元素值
};
class matrix
{
private:
node data[Max];
int mu, nu, tu; //行数,列数,非零元个数
public:
matrix()
{
mu = 0, nu = 0, tu = 0;
}
matrix multiply(matrix &b); //矩阵相乘
void get();
void print();
};
matrix matrix::multiply(matrix &b)
{
matrix c;
c.mu = mu;
c.nu = b.nu;
int *ropt = new int[b.mu + 1];
int *num = new int[b.mu + 1];
int *temp = new int[b.nu + 1];
for (int i = 0; i <= b.mu; i++)
num[i] = 0;
for (int i = 0; i < b.tu; i++)
num[b.data[i].i]++;
ropt[1] = 0;
for (int i = 2; i <= b.mu; i++)
ropt[i] = ropt[i - 1] + num[i - 1];
int p = 0;
int r = 0;
int j = 0, q = 0, t = 0;
for (int i = 1; i <= mu; i++)
{
for (j = 1; j <= b.nu; j++)
temp[j] = 0;
while (i == data[p].i)
{
q = data[p].j;
if (q < b.mu)
t = ropt[q + 1];
else
t = b.tu;
for (int x = ropt[q]; x < t; x++)
{
j = b.data[x].j;
temp[j] += data[p].v * b.data[x].v;
}
p++;
}
for (j = 1; j <= b.nu; j++)
{
if (temp[j] != 0)
{
c.data[r].i = i;
c.data[r].j = j;
c.data[r].v = temp[j];
r++;
}
}
}
c.tu = r;
return c;
}
void matrix::get()
{
cout << "请输入矩阵的行数,列数及非零元个数" << endl;
cin >> mu >> nu >> tu;
cout << "请输入非零元的行标,列标,及数值" << endl;
for (int i = 0; i < tu; i++)
cin >> data[i].i >> data[i].j >> data[i].v;
}
void matrix::print()
{
for (int i = 0; i < tu; i++)
cout << data[i].i << " " << data[i].j << " " << data[i].v << endl;
}
int main()
{
matrix a, b, c;
cout << "对矩阵A进行初始化" << endl;
a.get();
cout << "对矩阵B进行初始化" << endl;
b.get();
cout << "矩阵A与矩阵B相乘的结果为" << endl;
c = a.multiply(b);
c.print();
system("pause");
}