*************************************************SparseMatrix.h***********************************************
#include <iostream>
using namespace std;
const int maxNum=100;
template <class T>
class Trituple
{
public:
int row;
int col;
T data;
};
template <class T>
class SparseMatrix
{
friend istream& operator >>(istream& in,SparseMatrix<T> &m) //重載輸入運算符
{
cout<<"請輸入行數,列數以及非零元素個數:"; //初始化稀疏矩陣的行、列以及非零元素的個數
in>>m.row>>m.col>>m.terms;
if(m.terms>m.maxTerms)
{
cout<<"錯誤!非零元素溢出!";
}
else
{
for(int i=0;i<m.terms;i++)
{
cout<<"請輸入第"<<i+1<<"個非零元素的行數,列數以及非零元素的值:"; //通過初始化三元組來初始化矩陣
in>>m.t[i].row>>m.t[i].col>>m.t[i].data;
while((m.t[i].row>=m.row)||(m.t[i].col>=m.col)) //矩陣元素下標檢查
{
cout<<"錯誤!輸入的矩陣元素下標越界!請從新輸入:";
in>>m.t[i].row>>m.t[i].col>>m.t[i].data;
}
}
}
return in;
}
friend ostream& operator <<(ostream& out,SparseMatrix<T> &m) //重載輸出運算符
{
int i,j,k=0;
out<<"行:"<<m.row<<" 列:"<<m.col<<" 非零元素個數:"<<m.terms<<endl;
/*for(int i=0;i<m.terms;i++)
{
out<<"M["<<m.t[i].row<<"]["<<m.t[i].col<<"]="<<m.t[i].data<<endl; //以 M[行][列] 的形式輸出稀疏矩陣
}*/
for(i=0;i<m.row;i++)
{
for(j=0;j<m.col;j++)
{
if((m.t[k].row==i)&&(m.t[k].col==j))
{
out<<m.t[k++].data<<" ";
}
else
{
cout<<'0'<<" ";
}
}
out<<endl;
}
return out;
}
private:
int row;
int col;
int terms;
Trituple<T> *t; //三元組數組
int maxTerms; //最大元素數目
public:
SparseMatrix(int maxSize=maxNum) //構造函數
{
maxTerms=maxSize;
row=col=terms=0;
t=new Trituple<T>[maxSize];
}
~SparseMatrix() //析構函數
{
delete []t;
}
/*SparseMatrix<T> transposedMatrix() //課本上的矩陣轉置函數,邏輯正確,但是運行時內存報錯
{
int *rowSize=new int[col]; //存放轉置矩陣各行中的非零元素個數
int *rowStart=new int[col]; //存放轉置矩陣各行中非零元素開始的存放位置
SparseMatrix<T> tp(maxTerms); //存放轉置後的矩陣
tp.row=col;
tp.col=row;
tp.terms=terms;
if(terms>0)
{
int i=0;
int j=0;
for(i=0;i<col;i++) //初始化rowSize
rowSize=0;
for(i=0;i<terms;i++)
rowSize[t[i].col]++;
rowStart[0]=0;
for(i=1;i<maxTerms;i++) //初始化rowStart
rowStart[i]=rowSize[i]+rowStart[i-1];
//*****************************************
for(i=0;i<col;i++)
cout<<rowSize[i]<<" ";
cout<<endl;
for(i=0;i<col;i++)
cout<<rowStart[i]<<" ";
cout<<endl;
//******************************************
for(i=0;i<terms;i++)
{
j=rowStart[t[i].col]; //j轉置矩陣的三元組的行
//rowStart[t[i].col]++;
tp.t[j].row=t[i].col;
tp.t[j].col=t[i].row;
tp.t[j].data=t[i].data;
rowStart[t[i].col]++;
}
}
delete []rowSize;
delete []rowStart;
return tp;
}*/
void transposedMatrix(SparseMatrix &tp) //自己編寫的轉置矩陣函數
{
int i,j;
if(terms>0)
{
int Row=0;
tp.col=row; //初始化轉置矩陣的行、列以及非零元素個數
tp.row=col;
tp.terms=terms;
for(j=0;j<col;j++) //從第0列開始檢查
{
for(i=0;i<terms;i++)
{
if(t[i].col==j) //檢查原三元組的列,如果相同,則交換行、列賦值給轉置矩陣
{
tp.t[Row].row=t[i].col;
tp.t[Row].col=t[i].row;
tp.t[Row].data=t[i].data;
Row++;
}
}
}
}
}
/*void displayTrituple() //輸出三元組
{
for(int i=0;i<terms;i++)
{
cout<<t[i];
}
cout<<endl;
}*/
};
*******************************************SparseMatrixMain.cpp*************************************************
#include "stdafx.h"
#include <iostream>
//#include "Trituple.h"
#include "SparseMatrix.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
SparseMatrix<int> obj;
SparseMatrix<int> obj1;
cin>>obj;
//obj.displayTrituple(); //測試時使用的輸出三元組的函數
cout<<"*********************初始矩陣**********************"<<endl;
cout<<obj;
obj.transposedMatrix(obj1); //調用自己編寫的轉置函數
//obj.transposedMatrix(); //調用課本的轉置函數
cout<<"*********************轉置矩陣**********************"<<endl;
cout<<obj1;
//cout<<obj;
return 0;
}