#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 100
typedef struct{
int row,col;//非0元素的位置坐标。
int key;//非0元素的键值。
}Triple;
typedef struct{
Triple data[MAXSIZE];//非0元三元组表。
int mu,nu,totalNu;//mu矩阵行数,nu矩阵列数,totalNu矩阵非0元个数
}TSMatrix;//非0元三元组结构
//打印矩阵,感觉这个打印方法写的不是太好,要是大的矩阵就太浪费内存了,希望提出意见,非常想改进这个打印方法。
void printMatrix(TSMatrix matrix)
{
int temp[100][100];
for(int i=0;i!=100;i++)
{
for(int j=0;j!=100;j++)
{
temp[i][j]=0;
}
}
for(int i=0;i!=matrix.totalNu;i++)
{
temp[matrix.data[i].row][matrix.data[i].col]=matrix.data[i].key;
}
for(int i=0;i!=matrix.mu;i++)
{
for(int j=0;j!=matrix.nu;j++)
{
printf("%6d",temp[i][j]);
if(j==(matrix.nu-1))
cout<<endl;
}
}
}
//此转置方法仅适用于与totalNu<<mu*nu的情况。
//转置矩阵方法,采用的是先找到原矩阵中非0元素,然后对非0元素进行操作,所要的对象数组的小标进行相应修改。
void reverseMatrix(TSMatrix a,TSMatrix &b)
{
//转置后的矩阵行数是原先的列数。
b.mu=a.nu;
//转置后的矩阵列数是原先的行数。
b.nu=a.mu;
//非0元素总数不变
b.totalNu=a.totalNu;
//用来控制转置后的非0元素下表data[q]
int q=0;
//循环原矩阵的所有列
for(int col1=0;col1<a.nu;col1++)
//循环非0元素
for(int p=0;p<a.totalNu;p++)
//将每列的非0元素进行相应操作。
if(a.data[p].col==col1)
{
b.data[q].row=a.data[p].col;
b.data[q].col=a.data[p].row;
b.data[q].key=a.data[p].key;
++q;
}
}
int main()
{
TSMatrix matrix;
TSMatrix matrix1;
cout<<"input the row number of matrix:(betwwen 0 and 100)";
cin>>matrix.mu;
cout<<"input the colum number of matrix:(betwwen 0 and 100)";
cin>>matrix.nu;
cout<<"input total number whose key not equal to zero:(betwwen 0 and 100)";
cin>>matrix.totalNu;
for(size_t index=0;index!=matrix.totalNu;index++)
{
cin>>matrix.data[index].row>>matrix.data[index].col>>matrix.data[index].key;
}
printMatrix(matrix);
reverseMatrix(matrix,matrix1);
cout<<"转置后的矩阵为:"<<endl;
printMatrix(matrix1);
system("PAUSE");
return 0;
}