ADT稀疏矩阵 及 转置

ADT稀疏矩阵的表示及其快速转置

#include<iostream>
#include<fstream>
using namespace std;
#define MAXX 100
ifstream file("data.txt",ios::in);/
typedef struct 
{
	int row,col,value;

}term;
class Sparse_Matrix
{
private:
	int n_row,n_col,num;
	term *a;
public:
	Sparse_Matrix(int row,int col,int num);
	Sparse_Matrix(){;};
	void show();
	void transpose(Sparse_Matrix & B);
	void fast_transpose(Sparse_Matrix & B);
};



Sparse_Matrix::Sparse_Matrix(int row,int col,int num)
{
	this->n_row=row; 
	this->n_col=col;
	this->num=num;
	a=new term[num+1];
	for(int i=1;i<=num;i++)
	{
		//cin>>a[i].row>>a[i].col>>a[i].value;
		file>>a[i].row>>a[i].col>>a[i].value;
	}
}
void Sparse_Matrix::show()
{
	cout<<n_row<<"行"<<n_col<<"列"<< num<<"个值"<<endl;
	for(int i=1;i<=num;i++)
	{
		cout<<a[i].row<<"\t"<<a[i].col<<"\t"<<a[i].value<<endl;
	}

}

void Sparse_Matrix::transpose(Sparse_Matrix &B)
{
	B.n_col=n_row;
	B.n_row=n_col;
	B.num=num;
	term *b=new term[num+1];
	int c=1;
	for(int i=0;i<n_col;i++)
	{
		for(int j=1;j<=num;j++)
		{
			if(a[j].col==i) 
			{ b[c].row=a[j].col; b[c].col =a[j].row; b[c].value=a[j].value; c++;}
		}

	}
	B.a=b;
}
void Sparse_Matrix::fast_transpose(Sparse_Matrix & B)
{
	B.n_col=n_row;
	B.n_row=n_col;
	B.num=num;
	term *b=new term[num+1];
	int start_pos[MAXX],row_terms[MAXX];
	int i,j;
	for(i=0;i<n_col;i++) row_terms[i]=0;
	for(i=1;i<=num;i++)  row_terms[a[i].col]++;
	start_pos[0]=1;
	for(i=1;i<n_col;i++) start_pos[i]=start_pos[i-1]+row_terms[i-1];
	for(j=1;j<=num;j++)
	{
		int pos=start_pos[a[j].col]++;
		b[pos].row=a[j].col;
		b[pos].col=a[j].row;
		b[pos].value=a[j].value;
	}
	B.a=b;

}

int main()
{

	if(!file) {cout<<"failed open";  exit(1); }
	int r,c,n;
	file>>r>>c>>n;
	Sparse_Matrix A(r,c,n),B,C;

	cout<<"A:"<<endl; A.show();

	A.transpose(B);
	cout<<"B:"<<endl; B.show();

	A.fast_transpose(C);
	cout<<"C:"<<endl;  C.show();

	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值