#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct node{
int i,j,v;
}SYZ;
void createlist(SYZ *L,SYZ a[MAX],int x,int y,int z){
int n=0;
a[n].i=x; a[n].j=y; a[n].v=z;
n++;
printf("请输入数字所在的行数、列数以及对应的数值:\n\n");
scanf("%d",&a[n].i);scanf("%d",&a[n].j);scanf("%d",&a[n].v);
n++;
for(;n <= z;n++)
{
scanf("%d",&a[n].i);
scanf("%d",&a[n].j);
scanf("%d",&a[n].v);
}
}
void DataSort(SYZ *L,int x,SYZ a[MAX])
{
int s,t,k,temp1,temp2,temp3;
for(s=1;s<x;s++)
{ t=s;
for(k=s+1;k<=x;k++)
{
if(a[t].i>a[k].i){ t=k; }
}
if(t!=s)
{
temp1=a[s].i;
a[s].i=a[t].i;
a[t].i=temp1;
temp2=a[s].j;
a[s].j=a[t].j;
a[t].j=temp2;
temp3=a[s].v;
a[s].v=a[t].v;
a[t].v=temp3;
}
}
}
void print(SYZ a[MAX],int x,int y,int m[x][y])
{
printf("稀疏矩阵为:\n\n");
int i,j,k,s,r,t;
for(i=0;i<x;i++)
for(k=0;k<y;k++)
m[i][k]=0;
for(i=1;i<=a[0].v;i++){
s=a[i].i;r=a[i].j;t=a[i].v;
m[s-1][r-1]=t;
}
for(i=0;i<x;i++)
{
for(j=0;j<y;j++) printf("%6d",m[i][j]);
printf("\n");
}
}
void fillNum(SYZ a[],int num[])
{
int i=0,k;
for(i=1;i<=a[0].v;i++) num[i]=0;
for(i=1;i<=a[0].v;i++) { k=a[i].j;num[k]++;}
}
void fillPos(int num[],int pos[],SYZ a[]){
int i;
for(i=2;i<=a[0].j;i++){ pos[1]=1;pos[i]=pos[i-1]+num[i-1];}
}
void ZZ(SYZ a[],int pos[],SYZ b[])
{
int i=1,ma,p;
for(;i<=a[0].v;i++){
ma=a[i].j;p=pos[ma];
b[p].i=a[i].j;
b[p].j=a[i].i;
b[p].v=a[i].v;
pos[ma]++;
}
}
void print2(SYZ b[],int x,int y,int n[y][x],SYZ a[])
{
printf("\n转置后的矩阵为:\n");
int i,j,k,s,r,t;
for(i=0;i<y;i++)
for(j=0;j<x;j++)
n[i][j]=0;
for(k=1;k<=a[0].v;k++){
s=b[k].i;r=b[k].j;t=b[k].v;
n[s-1][r-1]=t;
}
for(i=0;i<y;i++)
{
for(j=0;j<x;j++) printf("%6d",n[i][j]);
printf("\n");
}
}
int main()
{
SYZ L;
int x,y,z;
printf("请依次输入矩阵总的行数、列数、以及非零字符的个数:\n");
scanf("%d",&x);scanf("%d",&y);scanf("%d",&z);
SYZ a[MAX];
createlist(&L,a,x,y,z);
DataSort(&L,x,a);
int m[x][y],n[y][x];
print(a,x,y,m);
SYZ b[MAX];
int num[y],pos[y];
fillNum(a,num);
fillPos(num,pos,a);
ZZ(a,pos,b);
print2(b,x,y,n,a);
return 0;
}