#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0

#define MAXSIZE 12500

typedef int elemtype;
typedef int status;
typedef struct {
int i,j;
elemtype e;
}triple;

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



status fast(tsmatrix m,tsmatrix &t)
{

int num[1000],cpot[1000]; //辅助数组
int col=0, p=0,q=0,z=0;
t.mu=m.nu;
t.nu=m.mu;
t.tu=m.tu;
if(t.tu)
{
for(col=0;col<m.nu;col++)
{
num[col]=0; //存储矩阵A中某列的非零元的个数
}
for(z=0;z<m.tu;z++)
{
num[m.data[z].j]++;
}
cpot[0]=0; //初值表示矩阵中某列的第一个非零元素在B中的位置


for(col=1;col<m.nu;col++)
{
cpot[col]=cpot[col-1]+num[col-1];
}

for(p=0;p<m.tu;p++)
{
col=m.data[p].j;
//先要知道顺序取到的是第几列
q=cpot[col];
//q赋值的是 该列的第一个非零元素的位置
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]++;
// 在赋值结束后,该列的非零元素位置后移。
}
}

return OK;
}



void creat(tsmatrix &t)
{

printf("请输入行号列号和非零元个数:\n");
scanf("%d%d%d",&t.mu,&t.nu,&t.tu);

int i;
for(i=0;i<t.tu;i++)
{
printf("请输入行号列号及值");
scanf("%d%d%d",&t.data[i].i,&t.data[i].j,&t.data[i].e);
}

}

status print(tsmatrix t)
{
int e=0,k=0,i=0,j=0;
for(i=0;i<t.mu;i++)
{
for(j=0;j<t.nu;j++)
{
if(i==t.data[k].i&&j==t.data[k].j)
{
printf("%d",t.data[k].e);
k++;
}
else
{
printf("%d",e);
}
}
printf("\n");
}
return 0;
}


int main()
{
tsmatrix t,m;

creat(m);
print(m);
printf("\n\n");
if(fast(m,t))
{
printf("转置成功!");
printf("\n\n");
print(t);
}

}