#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct{
int i,j;
int data;
}triple;
typedef struct{
triple data[MAXSIZE];//储存非0元素三元组
int len;
int n,m;
}TSMatrix;
int flag=0;
void createtriple(TSMatrix &T,int m,int n,int max)//创建矩阵
{
max = (rand()%20)+(rand()%20)*max;
srand((unsigned)time(NULL));
int i,j,value;
T.len=0;
T.m=m;
T.n=n;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
value = rand() % max;
if(value>20)
value=0;
if(value!=0)//不为0储存到三元组表中
{
T.data[T.len].i = i;
T.data[T.len].j = j;
T.data[T.len++].data = value;
}
}
}
}
void Print(TSMatrix T)//输出三元组表
{
int i=0;
printf("三元组表对应的i j data分别为:\n");
printf("i j data\n");
for(i=0;i<T.len;i++)
printf("%d %d %d\n",T.data[i].i,T.data[i].j,T.data[i].data);
}
void print(TSMatrix M,int m,int n)//输出矩阵
{
int i,j;
int T[m][n];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
T[i][j]=0;
}
for(i=0;i<M.len;i++)
{
T[M.data[i].i][M.data[i].j]+=M.data[i].data;
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(j!=n-1)
printf("%d ",T[i][j]);
else
printf("%d\n",T[i][j]);
}
}
}
void quicktrans(TSMatrix &T)//快速转置
{
int i,j;
TSMatrix M;
M.m=T.n;//转置行列属性
M.n=T.m;
M.len=T.len;
int nonzero[T.n+1]={0};//记录每列非零元个数
for(i=0;i<T.len;i++)
nonzero[T.data[i].j]++;
int cpot[T.n+1];
cpot[0]=0;
for(i=1;i<T.len;i++)
cpot[i]=cpot[i-1]+nonzero[i-1];
for(i=0;i<T.len;i++)
{
M.data[cpot[T.data[i].j]].i=T.data[i].j;
M.data[cpot[T.data[i].j]].j=T.data[i].i;
M.data[cpot[T.data[i].j]].data=T.data[i].data;
cpot[T.data[i].j]++;
}
T=M;
}
int main()
{
TSMatrix A;
int m,n,max;
printf("请输入矩阵的行和列(m和n):\n");
scanf("%d %d",&m,&n);
if(m<0 || n<0)
{
printf("你输入的值有误");
exit(0);
}
printf("限制矩阵最大值(输入一个合适数字):\n");
scanf("%d",&max);
createtriple(A,m,n,max);//创建矩阵A
printf("矩阵A为:\n");
print(A,m,n);//打印矩阵A
Print(A);//打印三元组A
quicktrans(A);//转置三元组A
printf("转置后A的三元组表:\n");
Print(A);//打印转置后A
printf("转置后A的矩阵为:\n");
print(A,m,n);
}
输入:
输出: