#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 ****************************************************************/