c++数据结构三元表法实现矩阵相乘


#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");
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值