#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100 //最多非0元素的个数
#define MAXR 100 //rpos所能处理的最大行数
#define MAXC 100 //系数矩阵相乘时,保留临时列结果的数组temp[MAXC]
typedef struct NODE{ //定义稀疏矩阵结点
int i;
int j;
int data;
} Node;
typedef struct MATRIX{ //定义稀疏矩阵(可以快速访问)
int mu, nu, tu;
Node matrix[MAXSIZE+1];
} Matrix;
//构建稀疏矩阵
int CreatSMatrix( Matrix *M )
{
int temp, i,j;
printf("输入矩阵行列数:");
scanf("%d %d", &M->mu, &M->nu);
M->tu = 0;
printf("输入矩阵:\n");
for( i = 1; i <= M->mu; i++)
{
for( j = 1; j <= M->nu; j++)
{
scanf("%d",&temp );
if( temp )
{ //非0值保存
M->matrix[M->tu+1].i = i;
M->matrix[M->tu+1].j = j;
M->matrix[M->tu+1].data = temp;
M->tu++;
}
}
}
return OK;
}
int Print( Matrix *M)
{
int i;
if(M->tu==0)
{
printf("空矩阵\n\n");
return ERROR;
}
printf("i\tj\tdata\n");
for( i=1; i<=M->tu; i++ )
printf("%d\t%d\t%d\n", M->matrix[i].i,M->matrix[i].j,M->matrix[i].data);
return OK;
}
int FastTranspose(Matrix M,Matrix *T)
{
int col,t,p,q;
int num[MAXSIZE],cpot[MAXSIZE];
T->mu = M.nu;
T->nu = M.mu;
T->tu = M.tu;
if(T->tu)
{
for(col = 1; col <= M.nu; ++col)
num[col] = 0;
for(t = 1; t <= M.tu; ++t)
++num[M.matrix[t].j];
cpot[1] = 1;
for(col = 2; col <= M.nu; ++col)
cpot[col] = cpot[col - 1] + num[col - 1];
for(p = 1; p <= M.tu; ++p)
{
col = M.matrix[p].j;
q = cpot[col];
T->matrix[q].i = M.matrix[p].j;
T->matrix[q].j = M.matrix[p].i;
T->matrix[q].data = M.matrix[p].data;
++cpot[col];
}
}
return OK;
}
int main()
{
Matrix M,N,T;
CreatSMatrix(&M);
Print(&M);
FastTranspose(M,&T);
printf("%d %d %d",T.mu,T.nu,T.tu);
Print(&T);
}
/*
int TransposeMartix(Matrix M,Matrix *T)
{
int col,q,p;
T->mu = M.nu;
T->nu = M.mu;
T->tu = M.tu;
if(T->tu)
{
q = 1;
for(col = 1; col <= M.nu; ++col)
for(p = 1; p <= M.tu; ++p)
if(M.matrix[p].j == col)
{
T->matrix[q].i = M.matrix[p].j;
T->matrix[q].j = M.matrix[p].i;
T->matrix[q].data = M.matrix[p].data;
++q;
}
}
return OK;
}
*/
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100 //最多非0元素的个数
#define MAXR 100 //rpos所能处理的最大行数
#define MAXC 100 //系数矩阵相乘时,保留临时列结果的数组temp[MAXC]
typedef struct NODE{ //定义稀疏矩阵结点
int i;
int j;
int data;
} Node;
typedef struct MATRIX{ //定义稀疏矩阵(可以快速访问)
int mu, nu, tu;
Node matrix[MAXSIZE+1];
} Matrix;
//构建稀疏矩阵
int CreatSMatrix( Matrix *M )
{
int temp, i,j;
printf("输入矩阵行列数:");
scanf("%d %d", &M->mu, &M->nu);
M->tu = 0;
printf("输入矩阵:\n");
for( i = 1; i <= M->mu; i++)
{
for( j = 1; j <= M->nu; j++)
{
scanf("%d",&temp );
if( temp )
{ //非0值保存
M->matrix[M->tu+1].i = i;
M->matrix[M->tu+1].j = j;
M->matrix[M->tu+1].data = temp;
M->tu++;
}
}
}
return OK;
}
int Print( Matrix *M)
{
int i;
if(M->tu==0)
{
printf("空矩阵\n\n");
return ERROR;
}
printf("i\tj\tdata\n");
for( i=1; i<=M->tu; i++ )
printf("%d\t%d\t%d\n", M->matrix[i].i,M->matrix[i].j,M->matrix[i].data);
return OK;
}
int FastTranspose(Matrix M,Matrix *T)
{
int col,t,p,q;
int num[MAXSIZE],cpot[MAXSIZE];
T->mu = M.nu;
T->nu = M.mu;
T->tu = M.tu;
if(T->tu)
{
for(col = 1; col <= M.nu; ++col)
num[col] = 0;
for(t = 1; t <= M.tu; ++t)
++num[M.matrix[t].j];
cpot[1] = 1;
for(col = 2; col <= M.nu; ++col)
cpot[col] = cpot[col - 1] + num[col - 1];
for(p = 1; p <= M.tu; ++p)
{
col = M.matrix[p].j;
q = cpot[col];
T->matrix[q].i = M.matrix[p].j;
T->matrix[q].j = M.matrix[p].i;
T->matrix[q].data = M.matrix[p].data;
++cpot[col];
}
}
return OK;
}
int main()
{
Matrix M,N,T;
CreatSMatrix(&M);
Print(&M);
FastTranspose(M,&T);
printf("%d %d %d",T.mu,T.nu,T.tu);
Print(&T);
}
/*
int TransposeMartix(Matrix M,Matrix *T)
{
int col,q,p;
T->mu = M.nu;
T->nu = M.mu;
T->tu = M.tu;
if(T->tu)
{
q = 1;
for(col = 1; col <= M.nu; ++col)
for(p = 1; p <= M.tu; ++p)
if(M.matrix[p].j == col)
{
T->matrix[q].i = M.matrix[p].j;
T->matrix[q].j = M.matrix[p].i;
T->matrix[q].data = M.matrix[p].data;
++q;
}
}
return OK;
}
*/