数据结构与算法作业4:稀疏矩阵的压缩存储

稀疏矩阵的压缩存储:

实现稀疏矩阵压缩存储,并实现矩阵转置和求和。

输入矩阵时,首先需要输入非零元素的个数,然后分别输入矩阵的 行号,列号和值。

输完2个矩阵后,自动进行计算第一个矩阵的转置以及两个矩阵的和。

例如:输入如下:

100 90 5 //矩阵的行数为100,列数为90,共5个非零元素。
1 10 100 //a(1,10)=100
50 60 200//a(50,60)=200
50 80 100//a(50,80)=100
60 60 200//a(60,60)=200
99 89 10//a(99,89)=10
100 90 4 //矩阵b的行数为100,列数为90,共4个非零元素。
1 1 10 //b(1,1)=10
50 60 -200//b(50,60)=-200
50 80 100 //b(50,80)=100
70 70 10 //b(70,70)=10

例如:

输入Result
100 90 5
1 10 100
50 60 200
50 80 100
60 60 200
99 89 10
100 90 4
1 1 10
50 60 -200
50 80 100
70 70 10
The transformed matrix  is:
10 1 100
60 50 200
60 60 200
80 50 100
89 99 10
The added matrix is:
1 1 10
1 10 100
50 80 200
60 60 200
70 70 10
99 89 10

答案 :

#include <iostream>
using namespace std;
struct Triple {                         
	int Hang, Lie;	                   
	int data;                
	void operator = (Triple & R)     
	{
		Hang = R.Hang;  Lie = R.Lie;  data = R.data;
	}
};
class SparseMatrix {
private:					 //a = a*b
	int Hangs, Lies, Terms;                  
	Triple   *smArray;                 
public:
	SparseMatrix(int maxSize=100);              
	void Transpose(SparseMatrix& B);               
	SparseMatrix Add(SparseMatrix& b);  //a = a+b
	friend ostream& operator << (ostream& out, SparseMatrix &M);
	friend istream& operator >> (istream& in, SparseMatrix &M);
};
SparseMatrix::SparseMatrix(int maxSize)
{
	Terms = maxSize;
	smArray = new Triple[maxSize];
	Hangs = Lies = 0;
};
void SparseMatrix::Transpose(SparseMatrix & B)
{
	int *hangSize = new int[Lies];       
	int *hangStart = new int[Lies];     
	B.Hangs = Lies;   B.Lies = Hangs;
	B.Terms = Terms;
	if (Terms > 0) {
		int i, j;
		for (i = 0; i < Lies; i++) hangSize[i] = 0;
		for (i = 0; i < Terms; i++)
			hangSize[smArray[i].Lie]++;
		hangStart[0] = 0;
		for (i = 1; i < Lies; i++)
			hangStart[i] = hangStart[i - 1] + hangSize[i - 1];
		for (i = 0; i < Terms; i++) {
			j = hangStart[smArray[i].Lie];
			B.smArray[j].Hang = smArray[i].Lie;
			B.smArray[j].Lie = smArray[i].Hang;
			B.smArray[j].data = smArray[i].data;
			hangStart[smArray[i].Lie]++;
		}
	}
	delete[] hangSize;   delete[] hangStart;
}
SparseMatrix SparseMatrix::Add(SparseMatrix & b)
{
	SparseMatrix res;
	int i = 0, j = 0, index_a, index_b;
	res.Terms = 0;
	while (i < Terms&&j < b.Terms) {
		index_a = Lies * smArray[i].Hang + smArray[i].Lie;
		index_b = Lies * b.smArray[j].Hang + b.smArray[j].Lie;
		if (index_a < index_b) {
			res.smArray[res.Terms] = smArray[i];
			i++;
		}
		else if (index_a > index_b) {
			res.smArray[res.Terms] = b.smArray[j];
			j++;
		}
		else{
			int vv= smArray[i].data + b.smArray[j].data;
			if (vv != 0) {
				res.smArray[res.Terms] = smArray[i];
				res.smArray[res.Terms].data = vv;
			}
			if (vv == 0) {
				res.Terms--;
			}
			i++; j++;
		}
		res.Terms++;
	}
	for (; i < Terms; i++) {
		res.smArray[res.Terms] = smArray[i];
		res.Terms++;
	}
	for (; j < b.Terms; j++) {
		res.smArray[res.Terms] = b.smArray[j];
		res.Terms++;
	}
	return res;
}
 
 
ostream & operator<<(ostream & out, SparseMatrix & M)
{
	for (int i = 0; i < M.Terms; i++) {
		out << M.smArray[i].Hang << " " << M.smArray[i].Lie << " " << M.smArray[i].data << endl;
	}
	return out;
}
 
istream & operator>>(istream & in, SparseMatrix & M)
{
	in >> M.Hangs >> M.Lies >> M.Terms;
	for (int i = 0; i < M.Terms; i++) {
		in >> M.smArray[i].Hang >> M.smArray[i].Lie >> M.smArray[i].data;
	}
	return in;
}
int main()
{
	SparseMatrix s,s2,s3,s4;
	cin >> s;
	cin >> s3;
	s.Transpose(s2);
	cout << "The transformed matrix  is: " <<" "<<endl;
	cout << s2;
	s4=s.Add(s3);
	cout << "The added matrix is:" << endl;
	cout << s4;
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华东设计之美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值