广义表的应用--稀疏矩阵的快速转置(三元组)

来源:互联网 发布:对外汉语教师网络兼职 编辑:程序博客网 时间:2024/05/22 05:03

 

#include<stdio.h>
#define MAXSIZE 10000
typedef struct{
  int i,j;
  int e;

}Triple;

typedef struct{
 Triple data[MAXSIZE+1];
 int mu,nu,tu;
}TSMatrix;

 int row,col;
TSMatrix *CreateSMatrix(TSMatrix *M)
{
   int m,n,p=1;
   int c;
 printf("please input array A:\n ");
  for(m=1;m<=row;m++)
    for(n=1;n<=col;n++)
   {
     scanf("%d",&c);
     if(c!=0)
       {
       M->data[p].e=c;
       M->data[p].i=m;
       M->data[p].j=n;
       p++;
       }
     }
  M->tu=p;M->mu=row;M->nu=col;
printf("the old TSMatrix is:\n\n");
for(m=1;m<=M->tu;m++)
  printf("%3d %3d %3d\n",M->data[m].i,M->data[m].j,M->data[m].e);
  printf("\n");
  return M;

}

TSMatrix *FastTransTSMatrix(TSMatrix *M,TSMatrix *T)
{
  int p,col,q,t,m;
  int num[100];
  int cpot[100];
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];
   cpot[1]=1;
 for(col=2;col<=M->nu;col++)
 cpot[col]=cpot[col-1]+num[col-1];
 for(p=1;p<=M->tu;++p)
{
 col=M->data[p].j;q=cpot[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;
 ++cpot[col];
 }
}
printf("\nThe new TSMatrix is:\n");
for(m=1;m<=T->tu;m++)
printf("%3d%3d%3d\n",T->data[m].i,T->data[m].j,T->data[m].e);

return T;
}
void print(TSMatrix *T,int x,int y)
{
 int m,n,p=1;
int d;
for(m=1;m<=x;m++)
{
  printf("\n");
  for(n=1;n<=y;n++)
{
  if(T->data[p].i==m&&T->data[p].j==n)
  {
  d=T->data[p].e;
  p++;
 }
else d=0;
printf("%6d",d);
}
}
}
void main()
{
  TSMatrix *M,*T;
 M=(TSMatrix *)malloc(sizeof(TSMatrix));
 T=(TSMatrix *)malloc(sizeof(TSMatrix));
printf("please input array's row and col:\n");
scanf("%d %d",&row,&col);

M=CreateSMatrix(M);
printf("The Creative array  is:\n");
print(M,row,col);
T=FastTransTSMatrix(M,T);
printf("The trans's array is:\n");
print(T,row,col);
getch();


}

 

原创粉丝点击