1、 数 据 结 构 课 程 设 计设计题目:基于三元组表的存储结构实现稀疏矩阵的应用学生姓名: 专业班级: 指导教师: 完成时间: 信 息 工 程 学 院 信科 系课程设计成绩评定表(本科)课题名称 基于三元组表的存储结构实现稀疏矩阵的基本操作院 系 年级专业学 号 姓 名 成 绩课题设计目的与设计意义1、课题设计目的:(1)掌握稀疏矩阵三元组表的存储、创建、显示、转置。(2)利用三元组表实现矩阵的相加、减。(3)了解稀疏矩阵的相关应用。2、课题设计意义:本次课题设计可以使我们更熟练的掌握有关三元组表及稀疏矩阵的相关知识,比一般存储方法节省了存储空间,基于三元组表的存储结构实现了稀疏矩阵的基本操
2、作。本次课程设计是本组成员共同努力而完成的,第一次进行课程设计是我们的探索过程,这个过程中,我们克服了一个个困难,在摸索中前行,我们相信通过此次课程设计我们每个人都会对数据结构这门课程有更深一步的了解。指导教师:年 月 日目 录一 、 课 题 设 计 目 的 及 意 义 11.1、课题设计目的 .11.2、课程设计意义 .1二 、 需 求 分 析 .12.1 设计函数建立稀疏矩阵及初始化值和输出稀疏矩阵的值 .12.2 构造函数进行稀疏矩阵的转置并输出结果 12.3 构造函数进行两稀疏矩阵相加、减及相乘并输出最终稀疏矩阵 12.4 退出系统 2三 、 项 目 设 计 .23.1 结构设计 .2
3、3.2 算法思想 .23.3 模块图 .23.4 流程图 .3四 、 系 统 实 现 .44.1 主调函数 .44.2 三元组表建立 .44.3 矩阵建立 .44.4 矩阵相加减及转置 .5五 、 系 统 调 试 .85.1 主菜单输出 .85.2 矩阵相加 .95.3 矩阵转置 .95.4 矩阵相减 10六 、 实 验 总 结 10七 、 附 录 111一 、 课 题 设 计 目 的 及 意 义 1.1、课题设计目的 (1)掌握稀疏矩阵三元组表的存储,创建,显示,转置等方法。(2)利用三元组表实现矩阵的相加,减。 (3)了解稀疏矩阵的相关应用。1.2、课程设计意义本次课题设计可以使我们更熟练
4、的掌握有关三元组表及稀疏矩阵的相关知识,比一般存储方法节省了存储空间,基于三元组表的存储结构实现了稀疏矩阵的基本操作。本次课程设计是本组成员共同努力而完成的,第一次进行课程设计是我们的探索过程,这个过程中,我们克服了一个个困难,在摸索中前行,我们相信通过此次课程设计我们每个人都会对数据结构这门课程有更深一步的了解。二 、 需 求 分 析稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,
5、而运算结果的矩阵则通常以阵列形式列出。2.1 设计函数建立稀疏矩阵及初始化值和输出稀疏矩阵的值本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值。在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情况,分别编制函数,才能准确的输出稀疏矩阵。在对稀疏矩阵进行初始化时,只输入非零元素的值和它所在的所在行及所在列。在对稀疏矩阵输出时,以矩阵的完整形式输出。2.2 构造函数进行稀疏矩阵的转置并输出结果 本模块要求设计函数进行稀疏矩阵的转
6、置并输出转置后的结果。在编写函数时,要先定义一个相应的结构体变量用于存放转置后的矩阵,最后把此矩阵输出。 2.3 构造函数进行两稀疏矩阵相加、减及相乘并输出最终稀疏矩阵本模块要求设计相加、减和相乘函数对两个矩阵进行运算,并输出最终的稀疏矩阵,定义相应的矩阵类型用于存放两个矩阵操作后的结果矩阵,这个结果矩阵的行、列数需要综合多方面情况来确定。这些函数也是整个程序的难点,2需要灵活运用数组及指针的特点。2.4 退出系统 本模块要求设置选项能随时结束程序的运行,本程序中采用 do-while 循环。程序在计算机上显示“提示信息”之后,由用户在键盘上输入演示程序中需要的相关信息及命令。 三 、 项 目
7、 设 计3.1 结构设计1、以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算2、稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。3.2 算法思想1、首先应输入矩阵的行数和列数。2、 以“带行逻辑链接信息”的三元组顺序表表数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和列数均不超过20。3、程序可以对三元组的输入顺序加以限制,例如,按行优先。注意研究教材的算法,以便提高计算效率。5.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放。4、主函数设置循环和选择语句进行运算
8、循环和选择,进行稀疏矩阵的加法,减法和转置。3.3 模块图稀疏矩阵的基本操作建立主调函数创建三元组表创建矩阵函数矩阵相加减、转置输 出33.4 流程图开 始用户选择计算类型加、减法运算转置运算显示结果等待用户键入继续计算结束运算键入D键入ANY4四 、 系 统 实 现4.1 主调函数#include#define smax 16typedef int datatype;typedef struct int i, j;datatype v; node;typedef struct() int m ,n,t;node datasmax;spmatrix;4.2 三元组表建立void print(s
9、pmatrix *a)int k;for(k=0;kt;k+)printf(“%dt%dt%dn“,a-datak.i,a-datak.j,a-datak.v);4.3 矩阵建立void printjuzhen(spmatrix *a)int k,p,l;int c55=0,0,0,0,0;for(k=0;kt;k+)ca-datak.ia-datak.j=a-datak.v;for(p=0;pm;p+)for(l=0;ln;l+)5printf(“%dt“,cpl);printf(“n“);4.4 矩阵相加减及转置pmatrix * xiangjia(spmatrix *a,spmatrix
10、 *b)spmatrix *c;int pa=0,pb=0,pc=0,sum=0;c=(spmatrix *)malloc(sizeof(spmatrix);if(a-m=b-m)c-n=a-n;while(patif(sum)c-datapc.v=sum;c-datapc.i=a-datapa.i;c-datapc.j=a-datapa.j;pc+;pa+;pb+;else6if(a-datapa.jdatapb.j)if(a-datapa.v)c-datapc.v=a-datapa.v;c-datapc.i=a-datapa.i;c-datapc.j=a-datapa.j;pc+;pa+;
11、elseif(b-datapb.v)c-datapc.v=b-datapb.v;c-datapc.i=b-datapb.i;c-datapc.j=b-datapb.j;pc+;pb+;elseif(a-datapa.idatapb.i)if(a-datapa.v)c-datapc.v=a-datapa.v;c-datapc.i=a-datapa.i;c-datapc.j=a-datapa.j;pc+;pa+;elseif(b-datapb.v)c-datapc.v=b-datapb.v;7c-datapc.i=b-datapb.i;c-datapc.j=b-datapb.j;pc+;pb+;e
12、lsereturn(0);while(pat)c-datapc.v=a-datapa.v;c-datapc.i=a-datapa.i;c-datapc.j=a-datapa.j;pc+;pa+;while(pbt)c-datapc.v=b-datapb.v;c-datapc.i=b-datapb.i;c-datapc.j=b-datapb.j;pc+;pb+;c-t=pc;return(c);8五 、 系 统 调 试5.1 主菜单输出图 1 主菜单输出95.2 矩阵相加图 2 矩阵相加5.3 矩阵转置图 3 矩阵转置105.4 矩阵相减图 4 矩阵相减六 、 实 验 总 结稀疏矩阵这个课题在我
13、们平时上课时我就感觉对于我而言这是比较困难的,矩阵的相关知识,三元组表的相关知识也一直让我比较惶恐,从拿到这个课题开始我就知道这次的课程设计必须用尽全力去认真对待。我深知团队合作的必要性,五个人的智慧总好过自己一个闭门造车,所以在课程设计过程中我们组进行了激烈地讨论,齐心协力地把这次课程设计做好。首先,我们根据课程设计所围绕的程序进行编程以及调试;其次,根据课程设计的要求进行实验目的以及实验意义的分析;再次之,进行需求分析的解决;然后将项目设计的算法思想,基本算法,主函数调用一一呈现出来。这是我们第一次进行比较专业的关于课程设计方面的运算,关于三元组表以及稀疏函数的相关应用,课程设计过程中,我
14、在利用三元组表实现稀疏矩阵相加的程序编制中,出现了很多问题,导致最后编译、执行、链接时不能成功,后来我查找了资料,去图书馆借了相关书籍,询问老师及本组同学,经过了好多次的改进,最后,终于完成了程序的编制。 通过一周的课程设计使我对数据结构有了更深的理解,对以前学习中不明白的,不理解的都有了进一步的理解。在实际操作中遇到了很多困难,但11通过找资料,请教同学和老师,使我的动手能力和沟通能力都有了提高。在整个课程设计中总是在编写程序中发生错误,有时会很没耐性,但都被我一一克服了,编程一定要有耐心,同时还有认真仔细,尽量保证不出现错误。编程要有条理,不仅使自己要看懂 ,别人也能看懂,这样有利于程序的改正。 在做完这个课程设计时,心里有种说不出来的高兴,自己动手完成的设计有一种成就感,增强了自己的自信心,我相信在今后的学习中,我会保持这种良好的心情投入学习。七 、 附 录参考文献1唐策善、李龙澍、黄刘生 . 数据结构用 C 语言描述.高等教育出版社.1994 年 12 月2严蔚敏、 吴伟民.数据结构第二版. 清华大学出版社. 19923 严蔚敏、 陈文博 .数据结构 .机械工业出版社.1990