快速转置矩阵(三元组)



快速转置矩阵(三元组)

#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;
}

猜你喜欢

转载自blog.csdn.net/xigongdali/article/details/79932115
今日推荐