//
//Created by zhuoL on 2021/10/20.
//
#include <stdio.h>
#include <stdlib.h>
// 非零元最大个数
#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;
}
C语言实现稀疏矩阵并转置
最新推荐文章于 2022-04-03 15:18:41 发布
本文介绍了如何使用C语言实现稀疏矩阵的创建、打印以及快速转置功能。通过`createSMatrix`函数获取用户输入构造稀疏矩阵,`printSMatrix`展示矩阵结构,`fastTranspose`函数则完成矩阵的转置过程。适合理解稀疏矩阵处理和基础算法实现。
摘要由CSDN通过智能技术生成