aes算法c语言实现_C语言实现常用数据结构:稀疏矩阵转置两种算法(第17篇)...

17448777163a74965386610db07f2a73.gif

「今天是学习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语言入门基本语法

更多请点击公众号历史文章...

25648f23ee3c373c35b575d872f3e5d3.png

「喜欢C请赏个 赞97c685536f120b5fb0cd64993cb8edd9.png    点击右下角 在看」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值