C++获取稀疏矩阵以及稀疏矩阵的两种转置方法

#include<iostream>
using namespace std;
#define maxSize 30
#define ROW 5
#define COL 5
typedef int DataType;


typedef struct {
	int row, col;
	DataType data;
}Triple;

typedef struct {
	int rows, cols, terms=0;
	Triple elem[maxSize];
}SparseMatrix;


SparseMatrix*GetSparseMatrix(DataType T[ROW][COL])
{
	SparseMatrix*S = new SparseMatrix;
	S->cols = COL;
	S->rows = ROW;
	for(int i=0;i<ROW;i++)
		for (int j = 0;j < COL;j++)
		{
			if (T[i][j] != 0)
			{
				S->elem[S->terms].data = T[i][j];
				S->elem[S->terms].row = i;
				S->elem[S->terms].col = j;
				S->terms++;
			}
		}
	return S;
}

void Print(SparseMatrix*S)
{
	for (int i = 0;i < S->terms;i++)
		cout << "row:" << S->elem[i].row << " col:" << S->elem[i].col << " data:" << S->elem[i].data << endl;
}

SparseMatrix*Transpose(SparseMatrix*S)
{
	SparseMatrix*ST = new SparseMatrix;
	ST->terms =0;
	ST->cols = S->rows;
	S->rows = S->cols;
	for(int i=0;i<S->cols;i++)
		for (int j = 0;j < S->terms;j++)
		{
			if (S->elem[j].col == i)
			{
				ST->elem[ST->terms].row = S->elem[j].col;
				ST->elem[ST->terms].col = S->elem[j].row;
				ST->elem[ST->terms].data = S->elem[j].data;
				ST->terms++;
			}
		}
	return ST;
}

SparseMatrix*FastTranspose(SparseMatrix*S)
{
	int*rowSize = new int[S->cols];
	int*rowStart = new int[S->cols];
	SparseMatrix*ST = new SparseMatrix;
	ST->cols = S->rows;
	ST->rows = S->cols;
	ST->terms = S->terms;
	for (int i = 0;i < S->cols;i++)
		rowSize[i] = 0;
	for (int i = 0;i < S->terms;i++)
		rowSize[S->elem[i].col]++;
	rowStart[0] = 0;
	for (int i = 1;i < S->cols;i++)
		rowStart[i] =rowStart[i-1]+rowSize[i-1];
	for (int i = 0;i < S->terms;i++)
	{
		ST->elem[rowStart[S->elem[i].col]].col = S->elem[i].row;
		ST->elem[rowStart[S->elem[i].col]].row = S->elem[i].col;
		ST->elem[rowStart[S->elem[i].col]].data = S->elem[i].data;
		rowStart[S->elem[i].col]++;
	}
	return ST;
}


int main()
{
	DataType M[ROW][COL];
	int k;
	for (int i = 0;i < ROW;i++)
		for (int j = 0;j < COL;j++)
			if ((k = rand() % 10 )> 6)
				M[i][j] = k;
			else
				M[i][j] = 0;
	SparseMatrix*SM=GetSparseMatrix(M);
	SparseMatrix*ST = Transpose(SM);
	SparseMatrix*FST = FastTranspose(SM);
	Print(SM);
	cout << "转置后:" << endl;
	Print(ST);
	cout << "快速转置后:" << endl;
	Print(FST);
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值