快速转置矩阵(三元组)
#include<stdio.h>
#include<string.h>
#define MAXN 200
typedef struct
{
int i,j;
int elem;
}triple;
typedef struct
{
triple data[MAXN];
int m,n,len;
}triplematrix;
int num[1000],cpot[1000];
void tsmatrix(triplematrix *a,triplematrix *b)
{
int ii,jj,cnt,col;
b->m=a->n,b->n=a->m,b->len=a->len;
if(a->len)
{
for(ii=0;ii<a->n;ii++)
num[ii]=0;
for(jj=0;jj<a->len;jj++) //data是从0开始记的
{
num[a->data[jj].j]++;
}
cpot[0]=0; //cpot是三元组中每一列第一个元素,cpot也符合有0下标的矩阵的,
//第0列第一个元素的位置自然是0
for(ii=1;ii<=a->n;ii++)
{
cpot[ii]=cpot[ii-1]+num[ii-1];
}
for(ii=0;ii<a->len;ii++)
{
col=a->data[ii].j;
cnt=cpot[col]; //cnt纪录cpot的反馈
b->data[cnt].i=a->data[ii].j;
b->data[cnt].j=a->data[ii].i;
b->data[cnt].elem=a->data[ii].elem;
++cpot[col];//就跑到这一列的第二个元素去了
}
}
}
void print(triplematrix *b)
{
int cnt;
for(cnt=0;cnt<(b->len);cnt++)
{
printf("%d %d %d\n",b->data[cnt].i,b->data[cnt].j,b->data[cnt].elem);
}
}
int main()
{
triplematrix a;
scanf("%d %d",&a.m,&a.n);
a.len=0;
int x1,x2,x3;
while(scanf("%d%d%d",&x1,&x2,&x3),x1||x2||x3)
{
a.data[a.len].i=x1;
a.data[a.len].j=x2;
a.data[a.len].elem=x3;
a.len++;
} //矩阵也有0行0列,但稀疏矩阵的三元组没有所谓的0行0列,下标都是从1开始的。
triplematrix b;
tsmatrix(&a,&b);
print(&b);
return 0;
}