数据结构实验报告

数据结构实验报告

实验题目

稀疏矩阵转置

实验内容

输出稀疏矩阵的转置矩阵。(行列均不大于 20)

一、需求分析

1. 输入
第一行输入两个正整数 n 和 m,分别表示矩阵的行数和列数,
然后输入矩阵三元组表,
最后输入(0 0 0)表示结束输入。
行列均不大于 20。

2. 输出
转置后的矩阵。

3. 程序执行的命令包括:(1) 构造稀疏矩阵;(2) 读入数据;(3) 转置计算;(4) 输 出结果;(5) 结束。

4. 测试数据:

输入

4 4
1 1 1
2 1 2
3 2 3
0 0 0

正确输出

1 1 1
1 2 2
2 3 3

二、概要设计

使用有序三元组表构建稀疏矩阵。

  1. 基本操作:
    create_tsmatrix()
    构造空稀疏矩阵
    read_tsmatrix()
    读取数据存入稀疏矩阵
    tsm_fast_trans()
    将矩阵转置
    tsm_print()
    输出稀疏矩阵

  2. 模块:
    (1) 主函数;
    (2) 构造三元组并读入数据;
    (3) 转置计算;
    (4) 输出矩阵;
    (5) 条用关系图:

主函数
构造三元组
读入数据
转置计算
输出矩阵

三、详细设计

  1. 数据类型:三元组与三元组表,采用行逻辑连接的稀疏矩阵;

    #define MAX 400
    
    typedef struct {
        int i, j;
        int v; /*value*/
    } triple;
    
    typedef struct {
        triple data[MAX];
        int h /*height*/, w /*width*/, len;
    } tsmatrix;
    
  2. 模块分析
    由于部分模块代码太短,故实际代码中直接写入主函数

    (1) 主函数:

    main() {
      int w, h, i, j, v;
      声明整数变量 h;
      声明整数变量 w;
      输入 h, w;
      创建空稀疏矩阵 a;
      读入数据到 a;
      转置 a,结果赋给 b;
      销毁 a;
      输出稀疏矩阵 b;
      销毁 b;
      结束;
    }
    

    (2) 创建空稀疏矩阵:

    create_tsmatrix(int h, int w) {
      声明稀疏矩阵指针变量 a;
      为 a 动态分配空间;
      a->h = h;
      a->w = w;
      a->len = 0;
      返回 a;
    }
    

    (3) 读入矩阵三元组数据:

    read_tsmatrix(tsmatrix *a) {
      声明整数变量 i;
      声明整数变量 j;
      声明整数变量 k;
      while True
        输入 i, j, k;
        if i==0 and j==0 and k==0
          结束循环;
        endif
        a->data[a->len].i = i;
        a->data[a->len].j = j;
        a->data[a->len].v = v;
        a->len++;
      endwhile
    }
    

    (4) 转置矩阵:

    tsm_fast_trans(tsmatrix *a) {
      声明整数变量 col, t, p, q;
      声明整数数组变量 pos[MAX];
      声明稀疏矩阵指针变量 b;
      为 b 动态分配空间;
      b->len = a->len;
      b->w = a->h;
      b->h = a->w;
      if b->len > 0
        /* 计算每行有多少元素,存于 pos */
        for t from 0 to a->len-1
          pos[t] = 0;
        endfor
        for t from 0 to a->len-1
          pos[a->data[t].j+1]++;
        endfor
        /* 计算每行第一个元素的开始位置 */
        pos[0] = 1;
        for (col=1; col<a->w; col++)
          pos[col] += pos[col-1];
        endfor
        /* 遍历矩阵 a 并转置 */
        for p from 0 to a->len-1
          col = a->data[p].j;
          q = pos[col];
          b->data[q] = a->data[p];
          pos[col]++;
        endfor
      endif
      返回 b;
    }
    

    (5) 输出矩阵

    tsm_print(tsmatrix *p) {
      if p == NULL
        返回;
      endif
      for i from 1 to p->len-1
        输出 p->data[i].i, p->data[i].j, p->data[i].v;
      endfor
    }
    

四、使用说明、测试分析及结果

1. 使用说明

(1) 运行环境为 Linux x86。

(2) 使用 GNU/GCC 编译源码:

gcc transmatrix.c -o transmatrix

(3) 执行 ELF 程序:

./transmatrix

(4) 按格式输入稀疏矩阵。

2. 测试结果与分析

测试输入的结果与正确结果匹配。

3. 调试过程中遇到的问题是如何解决提以及对设计与实现的回顾讨论和分析

4. 运行界面

在这里插入图片描述

五、实验总结

1. 编程费时 60 分钟,主要参考书上的算法,并做了一些优化(比如书上转置模块用了 num[] 和 pos[] 两个数组,而这里简化为一个 pos[])。

2. 纸上设计无。

3. 输入调试 10 分钟。

4. 思考问题 60 分钟,主要设计代码优化方面。

5. 该题较简单,算法清晰,无难题。

6. 收获:(1) 对于稀疏矩阵的三元组表实现及相关操作更加熟练;(2) 掌握稀疏矩阵快速转置算法;(3) 能够独立对算法进行一些简单优化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RainbowC0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值