「今天是学习C语言第 160 天」
纸上学来终觉浅,绝知此事要躬行。—— 陆游「冬夜读书示子聿」 #题外话 的确做任何事情的确贵在坚持,最近有段时间没有更新了,请各位童鞋(特别是童鞋 偲**)多包涵~~,另外请有时间可以去多复习下C语言前面基础文章。 C语言入门基础必学(2020.4版)# 稀疏矩阵转置
简单转置:矩阵的行列值互换,另外保证转置后的三元组按照次序排列,因此需要按照原矩阵的列序从小到大循环找到每列非零元转置,时间复杂度是 t(非零元个数)*n(列数)。
快速转置:事先确定每一列非零元的个数,以及每一列第一个非零元转置后的位置,这样一次循环即可完成转置,时间复杂度是O(t+n)。
# 代码运行结果
请输入矩阵的非零元个数、行数、列数:6 4 3请依次输入三元组:1 2 12 1 22 3 13 1 33 3 34 2 1简单转置后的矩阵的非零元个数、行数、列数:6 3 4简单转置后的矩阵三元组:1 2 21 3 32 1 12 4 13 2 13 3 3快速转置后的矩阵的非零元个数、行数、列数:6 3 4快速转置后的矩阵三元组:1 2 21 3 32 1 12 4 13 2 13 3 3--------------------------------Process exited after 29.23 seconds with return value 6请按任意键继续. . .
# 代码实现
1.这里简单使用三元组顺序表保存稀疏矩阵;
2.使用静态数组保存,大小固定,如果需要不定大小,应使用动态内存分配的方式。
/*========================================== 名称 :C语言实现常用数据结构 功能 :矩阵简单转置和快速转置 环境 :Windows 10 + Dev-C++编译 作者 :一只会C的猫 公众号 :C语言大全(coderpointer) 时间 :2020.8.24==========================================*/#include // 三元组顺序表表示稀疏矩阵// 矩阵非零元最大个数#define MAX_SIZE 1000typedef struct { // 行号、列号 int row, col; // 数据 int d;}triple;typedef struct { // data[0] 空留 triple data[MAX_SIZE+1]; // 矩阵行数、列数、非零元素数量 int m,n,t;}matrix;// 矩阵简单转置// 从原矩阵的列序循环转置 void simple_transpose_matrix(matrix *s, matrix *d){ // 转置后的行数、列数、非零元个数 d->m = s->n; d->n = s->m; d->t = s->t; // 矩阵非零元个数不为0 if(s->t > 0) { int col, p, q=1; // 从矩阵s的列循环遍历 for(col=1; col<=s->n; col++) { for(p=1; p<=s->t; p++) { if((s->data)[p].col == col) { (d->data)[q].row = (s->data)[p].col; (d->data)[q].col = (s->data)[p].row; (d->data)[q].d = (s->data)[p].d; q++; } } } } }// 快速转置// 使用辅助空间直接确定非零元转置后在矩阵数组中的位置void fast_transpose_matrix(matrix *s, matrix *d){ // 保存每一列非零元的个数 int number[MAX_SIZE]; // 保存每一列第一个非零元的三元组在转置后矩阵的位置 int position[MAX_SIZE]; // 转置后的行数、列数、非零元个数 d->m = s->n; d->n = s->m; d->t = s->t; // 矩阵非零元个数不为0 if(s->t > 0) { // 初始化 int col; for(col=1; col<=s->n; col++) number[col] = 0; // 统计每列非零元个数 int p; for(p=1; p<=s->t; p++) number[(s->data)[p].col] ++; // 统计每列第一个非零元的位置 position[1] = 1; for(p=2; p<=s->t; p++) position[p] = position[p-1] + number[p-1]; // 转置 int q; for(p=1; p<=s->t; p++) { col = (s->data)[p].col; q = position[col]; (d->data)[q].row = (s->data)[p].col; (d->data)[q].col = (s->data)[p].row; (d->data)[q].d = (s->data)[p].d; position[col] ++ ; } }}int main(void){ printf("请输入矩阵的非零元个数、行数、列数:"); int t,m,n; scanf("%d%d%d", &t, &m, &n); matrix s, d; s.m = m; s.n = n; s.t = t; // 依次读入三元组 printf("请依次输入三元组:\n"); int i; for(i=1; i<=s.t; i++) scanf("%d%d%d", &(s.data[i].row), &(s.data[i].col), \ &(s.data[i].d)); // 转置 simple_transpose_matrix(&s, &d); printf("简单转置后的矩阵的非零元个数、行数、列数:%d %d %d\n", \ d.t, d.m, d.n); printf("简单转置后的矩阵三元组:\n"); // 输出转置后的结果 for(i=1; i<=d.t; i++) printf("%d %d %d\n", d.data[i].row, d.data[i].col, d.data[i].d); // 快速转置 fast_transpose_matrix(&s, &d); printf("快速转置后的矩阵的非零元个数、行数、列数:%d %d %d\n", \ d.t, d.m, d.n); printf("快速转置后的矩阵三元组:\n"); // 输出转置后的结果 for(i=1; i<=d.t; i++) printf("%d %d %d\n", d.data[i].row, d.data[i].col, d.data[i].d);}
---------- End ----------
往期精彩推荐:
一万分钟C语言学习计划:2020开篇
C语言内存管理的两种方式
C89标准库功能简介
C语言链接与存储类型
C语言标准输入输出
C语言入门基本语法
更多请点击公众号历史文章...
「喜欢C请赏个 赞 点击右下角 在看」