#define _MASTRIX_H_
#define ERROR 0
#define MAXSIZE 12500//非零元的最大個數
typedef int ElemType;
typedef struct
{
int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
void Print(TSMatrix M);
int TransposeSMatrix(TSMatrix M,TSMatrix &T);
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T);
#include<iostream>
#include<iomanip>
using namespace std;
void Init(TSMatrix &M)
{
int p;//非零元個數
cout<<"請輸入矩陣的行數、列數、非零元的個數"<<endl;
cin>>M.mu>>M.nu>>M.tu;//輸入矩陣的行數、列數、非零元的個數
for(p=1;p<=M.tu;p++)
{
cin>>M.data[p].i>>M.data[p].j>>M.data[p].e;
}
}
void Print(TSMatrix M)
{
int k=1,i,j;
for(i=1;i<=M.mu;i++)
{
for(j=1;j<=M.nu;j++)
{
if(i==M.data[k].i&&j==M.data[k].j&&k<=M.tu)
{
cout<<setw(3)<<M.data[k].e;
k++;
}
else
{
cout<<setw(3)<<'0';
}
}
cout<<endl;
}
/*for(k=1;k<=M.tu;k++)
{
cout<<M.data[k].i<<setw(3)<<M.data[k].j<<setw(3)<<M.data[k].e<<endl;
}
cout<<endl;*/
}
int TransposeSMatrix(TSMatrix M,TSMatrix &T)
{
int col,p,q;
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)
{
q=1;
for(col=1;col<=M.nu;col++)
{
for(p=1;p<=M.mu;p++)
{
if(M.data[p].j==col)
{
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
q++;
}
}
}
}
return OK;
}
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
int copt[20],num[20];
int col,p,q,t;
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)
{
for(col=1;col<=M.nu;col++)
{
num[col]=0;
}
for(t=1;t<=M.tu;t++)//非零元的個數
{
++num[M.data[t].j];
}
copt[1]=1;
for(col=2;col<=M.nu;col++)
{
copt[col]=copt[col-1]+num[col-1];
}
for(p=1;p<=M.tu;p++)
{
col=M.data[p].j;
q=copt[col];
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++copt[col];
}
}
return OK;
}
#include<iostream>
using namespace std;
{
TSMatrix M,T;
int select;
Init(M);
do
{
cout<<"1.轉置之前遍歷!"<<endl;
cout<<"2.按列轉置!"<<endl;
cout<<"3.快速轉置!"<<endl;
cout<<"0.操作結束!"<<endl;
cout<<"請選擇:"<<endl;
cin>>select;
switch(select)
{
case 1:Print(M);
break;
case 2:
if(TransposeSMatrix( M,T)==OK)
{
Print(T);
}
else
{
cout<<"轉置出錯!"<<endl;
}
break;
case 3:
if(FastTransposeSMatrix( M,T)==OK)
{
Print(T);
}
else
{
cout<<"轉置出錯!"<<endl;
}
break;
case 0:
cout<<"操作結束!"<<endl;
break;
default:
cout<<"輸入錯誤!"<<endl;
}
}while(select!=0);
return 0;
}