// //Created by zhuoL on 2021/10/20. // #include#include // 非零元最大个数 #define MAXSIZE 20 // 定义三元组 typedef struct { int i, j, e;//行 列 非零元素值 } Triple; // 定义稀疏矩阵 typedef struct { Triple data[MAXSIZE + 1]; int mu, nu, tu;//行 列 非零元素的个数 } SMatrix; void printSMatrix(SMatrix *m) { int index = 1, test = 0; int i, j; for (i = 1; i <= m->mu; i++) { for (j = 1; j <= m->nu; j++) { index = 1; while (index <= m->tu) { if (i == m->data[index].i && j == m->data[index].j) { printf("%-4d", m->data[index].e); //index++; break; } index++; } if (index > m->tu) { printf("%-4d", test); } } printf("n"); } } SMatrix *createSMatrix() { SMatrix *m = (SMatrix *) malloc(sizeof(SMatrix)); int i = 1, number; //printf("请输入稀疏矩阵的行数,列数:n"); scanf("%d%d", &m->mu, &m->nu); flag1: //printf("请输入非零元的个数:n"); scanf("%d", &number); //如果非零元素个数>=矩阵总元素的30% 则重新输入 if (number >= (m->mu * m->nu) * 0.3) { //printf("非零元素个数不合格重新输入n"); goto flag1; } m->tu = number; //printf("请依次输入元素的行号,列号与数据:n"); int line, column, data; do { flag: scanf("%d%d%d", &line, &column, &data); if ((line < m->data[i - 1].i) || ((line == m->data[i - 1].i) && column < m->data[i - 1].j)) { goto flag; } m->data[i].i = line; m->data[i].j = column; m->data[i].e = data; ++i; } while (i <= m->tu); printf("Before:n"); printSMatrix(m); return m; } SMatrix *fastTranspose(SMatrix *m) { // 转置矩阵 SMatrix *t = (SMatrix *) malloc(sizeof(SMatrix)); t->mu = m->nu; t->nu = m->mu; t->tu = m->tu; if (t->tu) { // 保存矩阵每一列非零元的个数 int a, b, c; int *num = (int *) malloc(sizeof(int) * (m->nu + 1)); for (a = 1; a <= m->nu; a++) { num[a] = 0; } for (b = 1; b <= m->tu; b++) { num[m->data[b].j]++; } // 每一列第一个非零元的位置 int *cpot = (int *) malloc(sizeof(int) * (m->nu + 1)); cpot[1] = 1; for (c = 2; c <= m->nu; c++) { cpot[c] = cpot[c - 1] + num[c - 1]; } int d; // 遍历矩阵M,开始转置 for (d = 1; d <= m->tu; d++) { // 取出该元素的列号 int col = m->data[d].j; // 确定存放位置 int q = cpot[col]; t->data[q].i = m->data[d].j; t->data[q].j = m->data[d].i; t->data[q].e = m->data[d].e; cpot[col]++; } } //printf("n转置后的矩阵:n"); printf("After:n"); printSMatrix(t); return t; } int main() { SMatrix *sMatrix = createSMatrix(); fastTranspose(sMatrix); return 0; }



