#include <stdio.h>
#include <stdlib.h>
#define T 100
typedef struct
{
int i,j;
int e;
}Date;
typedef struct
{
Date date[T];
int nu,mu,tu;
}sb;
void Printsb(sb M);
void Transfer1(sb M,sb *N);
void Transfer2(sb M,sb *N);
void main()
{
sb M,N;
int k;
printf("请输入M的行数和列数以及非零元素的个数:\n");
scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu);
printf("请输入M中各个元素:\n");
for(k=0;k<M.tu;k++)
{
printf("请输入第%d个元素的行列序及其值:\n",k+1);
scanf("%d,%d,%d",&M.date[k].i,&M.date[k].j,&M.date[k].e);
}
printf("\n您输入的压缩矩阵为:");
Printsb(M);
printf("第一种方法转置后为:");
Transfer1(M,&N);
Printsb(N);
printf("第二种方法转置后为:");
Transfer2(M,&N);
Printsb(N);
}
void Printsb(sb M)
{
int k;
printf("\n\n-----------------\n");
printf("| i | j | e |\n");
for(k=0;k<M.tu;k++)
{
printf("|%5d|%5d|%5d|\n",M.date[k].i,M.date[k].j,M.date[k].e);
}
printf("-----------------\n\n");
}
void Transfer1(sb M,sb *N)
{
int n,t,k=0;
N->mu=M.nu;
N->nu=M.mu;
N->tu=M.tu;
for(n=1;n<=N->mu;n++)
{
for(t=0;t<M.tu;t++)
{
if(M.date[t].j==n)
{
N->date[k].i=M.date[t].j;
N->date[k].j=M.date[t].i;
N->date[k].e=M.date[t].e;
k++;
}
}
}
}
void Transfer2(sb M,sb *N)
{
int k,n,t,f;
int num[T],copt[T];
N->mu=M.nu;
N->nu=M.mu;
N->tu=M.tu;
for(k=1;k<=M.nu;k++)
num[k]=0;
for(k=0;k<M.tu;k++)
num[M.date[k].j]++;
copt[1]=0;
for(k=2;k<=M.nu;k++)
copt[k]=copt[k-1]+num[k-1];
for(n=0;n<M.tu;n++)
{
t=M.date[n].j;
f=copt[t];
N->date[f].i=M.date[n].j;
N->date[f].j=M.date[n].i;
N->date[f].e=M.date[n].e;
copt[t]++;
}
}