#define MAXSIZE 12500
typedef struct{
int s;
char b;
}ElemType;
typedef struct{
int i,j;
ElemType e;
}Tripe;
typedef struct{
int mu,nu,tu; //行 列 和非零元个数
Tripe data[MAXSIZE+1];
}TSMatrix;
//稀疏矩阵转置的一般算法。
int TransposeSMatrix(TSMatrix &T,TSMatrix &M){
T.mu=M.nu; T.nu=M.mu;T.tu=M.tu;
int col;
int p,q=1;
if(T.tu){
for(col=1;col<=M.nu;col++){
for(p=1;p<=M.tu;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 0;
}
return 1;
}
//稀疏矩阵转置的改进算法
int TransposeSMatrix(TSMatrix &T,TSMatrix &M){
int num[MAXSIZE];
int cpot[MAXSIZE];
int col=1,p;
T.tu=M.tu;
T.mu=M.nu;
T.nu=M.mu;
for(col=1;col<=M.nu;col++) num[col]=0;
for(p=1;p<=T.tu;p++)
++num[M.data[p].j]; //得到每列的非零元的个数总数。
cpot[1]=1;
for(col=2;col<=M.nu;col++)
cpot[col]=cpot[col-1]+num[col-1]; //得到每列的第一个非零元素的位置。
for(p=1;p<=T.nu;p++){
col=M.data[p].j;
T.data[cpot[col]].e=M.data[p].e;
T.data[cpot[col]].i=col;
T.data[cpot[col]].j=M.data[p].i;
cpot[col]++;
}
return 0;
}