三元组转置稀疏矩阵

#pragma once
#define MAXSIZE 1000
#include<iostream>
using namespace std;
template<class DataType>
class triple {
public:
	int row, col;
	DataType e;
};

template<class DataType>
class Mtriple {
public:
	int mrow, mcol, mnum;//mnum是非0个数
	triple<DataType>data[MAXSIZE + 1];

	void transpose(Mtriple a);
	void printm(Mtriple a);

	Mtriple(int mrow, int mcol, DataType *m);
	Mtriple();
	~Mtriple();
};

template<class DataType>
inline Mtriple<DataType>::Mtriple(int mrow,int mcol, DataType *m)
{
	cout << 'i' << " " << 'j' << " " << 'v' << endl;
	int cnt = 0;
	this->mrow = mrow;
	this->mcol = mcol;
	for (int i = 0; i < mrow; i++) {
		for (int j = 0; j < mcol; j++) {
			if (*(m+i*mcol+j) != 0) {
				//this->data[++cnt] = m[i][j];
				
				this->data[++cnt].row = i+1;
				this->data[cnt].col = j+1;
				this->data[cnt].e = *(m + i * mcol + j);
				cout << this->data[cnt].row << " " << this->data[cnt].col << " " << this->data[cnt].e << endl;
			}
		}
	}
	this->mnum = cnt;
}

template<class DataType>
inline Mtriple<DataType>::Mtriple()
{
}


template<class DataType>
inline void Mtriple<DataType>::transpose(Mtriple a)
{
	cout <<endl<< 'i' << " " << 'j' << " " << 'v' << endl;
	int cnt = 1;
	a.mrow = this->mcol;
	a.mcol = this->mrow;
	a.mnum = this->mnum;

	for (int j = 1; j <= this->mcol; j++) {
		for (int i = 1; i <= this->mnum; i++) {
			if (this->data[i].col == j) {
				a.data[cnt].row = j;
				a.data[cnt].col = this->data[i].row;
				a.data[cnt].e = this->data[i].e;
				cout << a.data[cnt].row << " " << a.data[cnt].col << " " << a.data[cnt].e << endl;
				++cnt;
			}
		}
	}
	printm(a);
}

template<class DataType>
inline void Mtriple<DataType>::printm(Mtriple a)
{
	cout << endl << "转置矩阵:" << endl;
	int flag = 1;
	for (int i = 1; i <= a.mrow; i++) {
		for (int j = 1; j <= a.mcol; j++) {
			for (int k = 1; k <= a.mnum; k++) {
				if ((j == a.data[k].col)&&(i == a.data[k].row)) {
					cout << a.data[k].e << " ";
					flag = 1;
					break;
				}
				else
					flag = 0;
			}
			if (flag == 0) {
				cout << 0 << " ";
			}
		}
		cout << '\n';
	}
}


template<class DataType>
inline Mtriple<DataType>::~Mtriple()
{
}

  

#include<iostream>
#include<stdlib.h>
#include"triple.h"
using namespace std;
//void fun(int m[3][4]) {
//
//	for (int i = 0; i < 3; i++)
//		for (int j = 0; j < 4; j++)
//			cout << m[i][j];
//}
int main() {

	int m[3][4] = { 
		{0,0,0,1},
		{1,0,0,1},
		{0,0,1,0} };

	
	Mtriple<int> t(3, 4, (int*)m);
	Mtriple<int> p;
	t.transpose(p);
	//fun(m);
	
	system("pause");
	return 0;
}

  

posted @ 2019-11-04 16:10  风间6324  阅读(477)  评论(0编辑  收藏  举报