#include <stdio.h>
#define MAXSIZE 12500 // 假设非零元个数的最大值为12500
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType; // 定义基本元素的类型为 int 型
typedef struct{
int i, j; // 该非零元的行下标和列下标
ElemType e;
}Triple;
typedef struct{
Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
int mu, nu, tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;
void InputMatrix(TSMatrix &M){
// 读入矩阵 M,r、c为该矩阵的行和列数
int i, j;
int data; // 用来存储临时读取近来的数据
M.tu = 0; // 先将非零元地数目初始化为0
for(i=1; i<=M.mu; i++){
for(j=1; j<=M.nu; j++){
scanf("%d", &data); // 读入元素
if(data){ // 如果 data 为非零元
M.tu++; // 先对非零元地数目加1,因为data[0]未用
M.data[M.tu].e = data; // 储存非零元
M.data[M.tu].i = i; // 记录当前元素的行号
M.data[M.tu].j = j; // 记录当前元素的列号
}
}
}
}
void OutputMatrix(TSMatrix M){
// 输出矩阵
int i, j; // 定义迭代变量
int t = 1; // 定位需要输出矩阵中的位置
for(i=1; i<=M.mu; i++){
for(j=1; j<=M.nu; j++){
if(i==M.data[t].i && j==M.data[t].j){ // 需要输出非零元
printf("%d ", M.data[t].e);
t++; // 定位下次需要输出的元素
}else{
printf("0 "); // 输出零元
}
}
putchar('\n'); // 换行
}
}
Status TransposeSMatrix(TSMatrix M, TSMatrix &T) { // 算法5.1
// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
int p, q, col;
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.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;
} // TransposeSMatrix
int main(){
TSMatrix M, T; // 定义存储矩阵的变量
scanf("%d%d", &M.mu, &M.nu);
InputMatrix(M);
TransposeSMatrix(M, T);
OutputMatrix(T);
return 0;
}
/**************************************************************
Problem: 2153
User: admin
Language: C++
Result: Accepted
Time:16 ms
Memory:1612 kb
****************************************************************/