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


#define OK 1
#define ERROR 0

#define MAXSIZE 12500 //假设非零元个数的最大值为12500


typedef int status;
typedef int elemtype;
typedef struct{
int i,j; //该非零元的行下标和列下标
elemtype e;
}triple;

typedef struct{
triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零元个数
}tsmatrix;



//------------------创建稀疏矩阵-------------//
status createsmartrix (tsmatrix &m)
{
printf("请输入稀疏矩阵的行数:");
scanf("%d",&m.mu);
printf("请输入稀疏矩阵的列数:");
scanf("%d",&m.nu);
printf("请输入非零元素的个数:");
scanf("%d",&m.tu);

int i;
for(i=0;i<m.tu;i++)
{
printf("请输入第%d个元素的行号列号及其元素的值:\n",i+1);
scanf("%d%d%d",&m.data[i].i,&m.data[i].j,&m.data[i].e);
}
}
//--------------------------------------------//

//--------------输出矩阵元素-----------------//
status print(tsmatrix m)
{
int i,j,k=0,e=0;

for(i=0;i<m.mu;i++)
{
for(j=0;j<m.nu;j++)
{
if(i==m.data[k].i&&j==m.data[k].j)
{
printf("%d",m.data[k].e);
k++;
}
else
{
printf("%d",e);
}
}
printf("\n");
}
}
//-------------------------------------------//


//---------------转置稀疏矩阵M为稀疏矩阵T----//
status transposesmatrix(tsmatrix m,tsmatrix &t)
{

status q,col,p;

t.mu=m.nu; //将M的列数给T的行数
t.nu=m.mu; //将M的行数给T的列数
t.tu=m.tu; //将M的非零元个数给T的非零元个数

if(t.tu!=0)
{
q=0; //设置元素的开始位置
//外层循环是 现在的行数 也是之前的列数
for(col=0;col<t.mu;col++)
{
for(p=0;p<t.tu;p++)
{
if(m.data[p].j==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;
q++;
}
}
}
}

return OK;

}

//------------------------------------------------------//


//-----------时间复杂度的解析--------------------------//
/*
该算法的主要时间耗费在col和p的两重循环上。
对于一个 m行n列 且非零元素个数为t的稀疏矩阵而言
该算法的时间复杂度是 O(t*n)。

最坏的情况,当稀疏矩阵中的非零元素个数t与mn同数量级时,
上述的时间复杂度就是O(mn*n)
*/


int main()
{
tsmatrix t,m;

printf("请输入稀疏矩阵:\n");

createsmartrix (m);
print(m);

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


return 0;

}