#include<bits/stdc++.h>
using namespace std;
#define maxsize 50
typedef int eletype;
typedef struct{
int line;//行值
int column;//列值
eletype value;//节点数值
}Nodes;//单个节点的定义
typedef struct{
Nodes node[maxsize];
int num;//三元组含节点个数
int linenum;//三元组行总数
int columnnum;//三元组列总数
}trmatrix;//三元组定义
//普通转置法
//void zhuanzhi1(eletype a[][],eletype b[][]){
// for(int i =0;i<m;i++)
// {
// for(int j=0;j<n;j++)
// {
// b[i][j]=a[j][i];
// }
// }
//}
//列序递增转置法 (原理是用position数组记录每一行第一个元素位置)
bool zhuanzhi(trmatrix a,trmatrix *b){
int i,j,k;
b->linenum=a.columnnum;
b->columnnum=a.linenum;
b->num=a.num;
if(b->num>0){
j=0;
for(k=1;k<=a.columnnum;k++)
{
for(i=0;i<a.num;i++)
{
if(a.node[i].column==k){
b->node[j].line=a.node[i].column;
b->node[j].column=a.node[i].line;
b->node[j].value=a.node[i].value;
j++;
}
}
}
}
}
//一次快速重定位
void fasttsmatrix(trmatrix a,trmatrix *b){
int col,t,p,q;
int num[maxsize],position[maxsize];
b->num=a.num;b->columnnum=a.linenum;b->linenum=a.columnnum;
if(b->num>0){
for(col=1;col<=a.columnnum;col++){
num[col]=0;
}
for(t=0;t<a.num;t++){
num[a.node[t].column]++;
}
position[1]=0;
for(col=2;col<=a.columnnum;col++){
position[col]=position[col-1]+num[col];
}
for(p=0;p<a.num;p++){
col=a.node[p].column;q=position[col];
b->node[q].value=a.node[p].value;
b->node[q].column=a.node[p].line;
b->node[q].line=a.node[p].column;
position[col]++;
}
}
}
//打印矩阵
void prints(trmatrix a){
for(int i=0;i<a.num;i++){
cout<<"row:"<<" "<<a.node[i].line<<" "<<"col"<<" "<<a.node[i].column<<" "
<<"value"<<" "<<a.node[i].value<<endl;
}
}
int main()
{
trmatrix a,c,d;
trmatrix *b=&c;
a.linenum=3;a.columnnum=4;
a.num=12;
int count=0;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++){
a.node[count].line=i+1;
a.node[count].column=j+1;
a.node[count].value=i*4+j+1;
count++;
}
prints(a);
cout<<endl;
zhuanzhi(a,b);//列序递增转置
prints(*b);
cout<<endl;
b=&d;
fasttsmatrix(a,b);//一次快速重定位转置
prints(*b);
}
运行结果如下
欢迎参考学习 批评指正