数据结构实验报告
实验题目
稀疏矩阵转置
实验内容
输出稀疏矩阵的转置矩阵。(行列均不大于 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
二、概要设计
使用有序三元组表构建稀疏矩阵。
-
基本操作:
create_tsmatrix()
构造空稀疏矩阵
read_tsmatrix()
读取数据存入稀疏矩阵
tsm_fast_trans()
将矩阵转置
tsm_print()
输出稀疏矩阵 -
模块:
(1) 主函数;
(2) 构造三元组并读入数据;
(3) 转置计算;
(4) 输出矩阵;
(5) 条用关系图:
三、详细设计
-
数据类型:三元组与三元组表,采用行逻辑连接的稀疏矩阵;
#define MAX 400 typedef struct { int i, j; int v; /*value*/ } triple; typedef struct { triple data[MAX]; int h /*height*/, w /*width*/, len; } tsmatrix;
-
模块分析
由于部分模块代码太短,故实际代码中直接写入主函数(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) 能够独立对算法进行一些简单优化。