1、数据结构实验滨江学院数据结构 课程设计题 目 稀疏矩阵运算器 院 系 理学系 年级班级 2012级信息与计算科学学生姓名 顾杨 学 号 20122314007 学 期 2014-2015(一) 任课教师 黄 群 二一四年 十二月 十 日1 引 言 本次课程设计的目的是深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。2 需求分析1本演示程序中,矩阵的行列人为规定,由个人输入需要计算的矩阵,首先选择自己需要计算方式,在输入所需要计算的矩阵,程序将根据选择进行计算,最后输出结果。2演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入相应数据(所需
2、计算矩阵的行列数及矩阵内个元素),程序将自动将稀疏矩阵保存在三元标中。3程序执行的命令包括:(1)构建三元列表;(2)输入所需计算矩阵的行列数;(3)输入矩阵内的全部元素(4)根据选择进行矩阵计算(5)输出矩阵4测试数据(1)a.mu=3 a.nu=3, 1 0 1 2 0 0 0 2 1b.mu b.nu 0 1 2 1 1 1 1 0 2加法输出:1 1 3 减法输出: 1 -1 -1 乘法输出: 1 1 4 3 1 1 1 -1 -1 0 0 0 1 2 3 -1 2 -1 3 0 23 概要设计为了实现上述操作,应以单向循环链表为存储结构。1input(&b) 基本操作: 以此输入稀疏
3、矩阵内每个元素 操作结果:建立三元列表b,并想稀疏矩阵内输入数据addmtirx( &a, &b, &c); 初始条件:存在两个不为空稀疏矩阵和一个空的三元列表操作结果 :将两个稀疏矩阵相加,并将得数存储在c中transposesmatrix(&a,&b);初始条件:存在一个不为空稀疏矩阵和一个空的三元列表操作结果 :将含有数据的稀疏矩阵转置,并将得数存储在b中multmatrix(&a,&b,&c); 初始条件:存在两个不为空稀疏矩阵和一个空的三元列表操作结果 :将两个稀疏矩阵相乘,并将得数存储在c中submtirx(&a,&b,&c) 初始条件:存在两个不为空稀疏矩阵和一个空的三元列表操作
4、结果 :将两个稀疏矩阵相加减,并将得数存储在c中Out put ( ) 初始条件:存放稀疏矩阵三元列表存在 操作结果:输出计算后的稀疏矩阵2 本程序包含三个模块:(1)主程序模块;(2)输入需要计算的稀疏矩阵(3)选择计算方法,并计算(4)输出计算后的矩阵(5)模块调用图: 主程序模块输入需要计算的稀疏矩阵选择计算方法,并计算输出计算后的矩阵4 详细设计1元素类型,列表类型和指针类型:# include#include #define maxsize 100typedef int datatype;typedef struct/定义三元组 int i,j; datatype x;matrix;
5、typedef struct/定义三元组表 matrix datamaxsize; int mu,nu,tu;/矩阵行,列,非零元个数tripulematrix;2每个模块的分析:(1)主程序模块:void main() printf(-矩 阵 计 算-n); printf(请选择你需要的计算方式n); printf(-1.稀疏矩阵的转置-n); printf(-2.稀疏矩阵的加法-n); printf(-3.稀疏矩阵的减法-n); printf(-4.稀疏矩阵的乘法-n); printf(-5.退 出-n); char x; scanf(%c,&x); tripulematrix a,b,c
6、; switch(x) case 1: /tripulematrix a,b; printf(请输入矩阵的行数与列数n); scanf(%d%d,&a.mu,&a.nu); b.mu=a.mu; b.nu=a.nu; printf(请输入一个矩阵,例如:n); printf(1 2 3n2 3 4n4 5 6n); printf(请输入n); input(&a); transposesmatrix(&a,&b); output(&b); break; case 2: / tripulematrix a,b,c; printf(请输入矩阵的行数与列数n); scanf(%d%d,&a.mu,&a
7、.nu); b.mu=a.mu; b.nu=a.nu; printf(请输入两个矩阵,例如:n); printf(1 2 3n2 3 4n4 5 6n); printf(请输入n); printf(请输入第一个矩阵n); input(&a); printf(请输入第二个矩阵n); input(&b); addmtirx( &a, &b, &c); output(&c); break; case 3: /tripulematrix a,b,c; printf(请输入矩阵的行数与列数n); scanf(%d%d,&a.mu,&a.nu); b.mu=a.mu; b.nu=a.nu; printf(
8、请输入两个矩阵,例如:n); printf(1 2 3n2 3 4n4 5 6n); printf(请输入n); printf(请输入第一个矩阵n); input(&a); printf(请输入第二个矩阵n); input(&b); submtirx(&a,&b,&c); break; case 4: /tripulematrix a,b,c; printf(请输入矩阵的行数与列数n); scanf(%d%d,&a.mu,&a.nu); b.mu=a.mu; b.nu=a.nu; printf(请输入两个矩阵,例如:n); printf(1 2 3n2 3 4n4 5 6n); printf(
9、请输入第一个矩阵n); input(&a); printf(请输入第二个矩阵n); input(&b); multmatrix(&a,&b,&c); break; case 5: exit(0); break; system(pause); (2)输入数据void input (tripulematrix *a) int i,j ,k=0; datatype x; for (i=0;imu;i+) for (j=0;jnu;j+) scanf(%d,&x); if (x)/如果是非零元 a-datak.i=i; a-datak.j=j; a-datak.x=x; k+; a-tu=k;/inp
10、ut(3)加法datatype addmtirx(tripulematrix *a,tripulematrix *b,tripulematrix *c) int k=0,l=0; c-mu=a-mu; c-nu=a-nu; c-tu=0; while (ktu<u) if (a-datak.i=b-datal.i)&(a-datak.j=b-datal.j) int temp=a-datak.x+b-datal.x; if (temp!= 0) c-datac-tu.x=a-datak.x+b-datal.x; c-datac-tu.i=a-datak.i; c-datac-tu.j=a-
11、datak.j; c-tu+; k+;l+; else if (a-datak.i=b-datal.i)&(a-datak.jdatal.j) c-datac-tu.x=a-datak.x; c-datac-tu.i=a-datak.i; c-datac-tu.j=a-datak.j; c-tu+; k+; else if (a-datak.i=b-datal.i)&(a-datak.jb-datal.j)|(a-datak.ib-datal.i) c-datac-tu.i=b-datal.i; c-datac-tu.j=b-datal.j; c-datac-tu.x=b-datal.x; c
12、-tu+; l+; while(ktu) c-datac-tu.x=a-datak.x; c-datac-tu.i=a-datak.i; c-datac-tu.j=a-datak.j; c-tu+; k+; while(ltu) c-datac-tu.i=b-datal.i; c-datac-tu.j=b-datal.j; c-datac-tu.x=b-datal.x; c-tu+; l+; return (1);(4)减法datatype submtirx(tripulematrix *a,tripulematrix *b,tripulematrix *c)/减法 int k=0,l=0;
13、c-mu=a-mu; c-nu=a-nu; c-tu=0; while (ktu<u) if (a-datak.i=b-datal.i)&(a-datak.j=b-datal.j) /int temp=a-datak.x-b-datal.x; /if (temp!= 0) / c-datac-tu.x=a-datak.x-b-datal.x; c-datac-tu.i=a-datak.i; c-datac-tu.j=a-datak.j; c-tu+; / k+;l+; else if (a-datak.i=b-datal.i)&(a-datak.jdatal.j)|(a-datak.ida
14、tal.i) c-datac-tu.x=a-datak.x; c-datac-tu.i=a-datak.i; c-datac-tu.j=a-datak.j; c-tu+; k+; else if (a-datak.i=b-datal.i)&(a-datak.jb-datal.j)|(a-datak.ib-datal.i) c-datac-tu.i=b-datal.i; c-datac-tu.j=b-datal.j; c-datac-tu.x=-b-datal.x; c-tu+; l+; while(ktu) c-datac-tu.x=a-datak.x; c-datac-tu.i=a-data
15、k.i; c-datac-tu.j=a-datak.j; c-tu+; k+; while(ltu) c-datac-tu.i=b-datal.i; c-datac-tu.j=b-datal.j; c-datac-tu.x=-b-datal.x; c-tu+; l+; return (1);(5)转置int transposemartix(tripulematrix *a,tripulematrix *b) int col,p,q; b-mu=a-nu; b-nu=a-mu; b-tu=a-tu; if(b-tu) q=0; for(col=0;colnu;col+) for(p=0;ptu;
16、p+) if(a-datap.j=col) b-datap.i=a-dataq.j; b-datap.j=a-dataq.i; b-datap.x=a-dataq.x; q+; return (1);/稀疏矩阵的转置算法(六)乘法int multmatrix(tripulematrix *a,tripulematrix *b, tripulematrix *c) int rpos1maxsize,rpos2maxsize,nummaxsize,rpos3maxsize; int row1,row2,arow,tp,t,brow,ccol,p,q,k; int ctempmaxsize; if
17、(a-tu) for (row1=0;row1mu;row1+) numrow1=0; for(row1=0;row1tu;row1+) +numa-datarow1.i; rpos10=0; for(row1=1;row1mu;row1+) rpos1row1=rpos1row1-1+numrow1-1; if (b-tu) for (row2=0;row2tu;row2+) numrow2=0; for(row2=0;row2tu;row2+) +numb-datarow2.i; rpos20=0; for(row2=1;row2mu;row2+) rpos2row2=rpos2row2-
18、1+numrow2-1; c-mu=a-mu;c-nu=b-nu;c-tu=0; if(a-tu*b-tu != 0) for (arow=0;arowmu;arow+) for(k=0;ktu+1; if (arowmu-1) tp=rpos1arow+1; else tp=a-tu; for (p=rpos1arow;pdatap.j;/找到对应元在b中的行号 if (brownu-1) t=rpos2brow+1; else t=b-tu; for (q=rpos2brow;qdataq.j;/乘积元素在Q中的列号 ctempccol += (a-datap.x)*(b-dataq.x)
19、; for(ccol=0;ccolnu;ccol+) if (ctempccol) if (c-tumaxsize) return 0; c-datac-tu.i=arow; c-datac-tu.j=ccol; c-datac-tu.x=ctempccol; c-tu+; return 1;(4)函数调用关系图main()input(&a);transposesmatrix(&a,&b); submtirx(&a,&b,&c);addmtirx( &a, &b, &c);multmatrix(&a,&b,&c);output(); 5 程序使用说明及测试结果1程序使用说明(1)本程序的运行环
20、境为VC6.0。(2)进入演示程序后即显示提示信息:-矩 阵 计 算-请选择你需要的计算方式-1.稀疏矩阵的转置-2.稀疏矩阵的加法-3.稀疏矩阵的减法-4.稀疏矩阵的乘法-5.退 出-1请输入矩阵的行数与列数3 3请输入一个矩阵,例如:1 2 31 1 11 1 1得出: 1 1 1 2 1 1 3 1 1请按任意键继续. . . 3调试中的错误及解决办法。(1) 转置出现问题(2) 输出时无法利用数组第一个空间(3) 三元表定义是无rpos(每行第一个非零元位置)解决方式:逐步调试,以及问同学,自己更改算法,计算出rpos6 致谢经过1个月的忙碌和努力,此次论文设计也将基本完成。作为一个本
21、科生的论文,由于我自身经验的匮乏及学识所限,不可避免仍有许多疏忽错漏的细节。如果没有导师的督促指点,以及一起研究的同学们的支持和鼓励,完成这次毕业设计就将是愚公移山,断不可行。在此次论文写作过程中,老师对我的亲切关怀和耐心指导尤其激励着我。她恭肃的学术态度,严谨的治学精神,认真专注的工作作风,给我留下深刻的印象并成为我今后学习生活的目标。从最初的选择课题到最终完成论文,老师都始终非常耐心的指导和帮助我。 衷心感谢各位老师在百忙中评阅本论文,并提出了宝贵意见。本文引用了数位学者的研究文献,正是各位学者的研究成果才启发我完成了本篇论文的写作。 由于我的个人水平局限,这篇论文难免有不足之处,恳请各位老师批评指正!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1