ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:146.82KB ,
资源ID:6880237      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6880237.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(稀疏矩阵应用.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

稀疏矩阵应用.docx

1、稀疏矩阵应用稀疏矩阵应用 课题简介课题及要求稀疏矩阵应用(限1 人完成)设计要求:实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。(1)稀疏矩阵的存储(2)稀疏矩阵加法(3)矩阵乘法(4)矩阵转置课程任务分析本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C; 求出A的转置矩阵D,输出D; 求两个稀疏矩阵A和B的相乘矩阵E,并输出E。课程的意义其意义是让咱们在学习完C、数据结构等课程基础上,掌握多

2、维数组的逻辑结构和存储结构、掌握稀疏矩阵的紧缩存储及转置,相加,相乘等大体操作,并用不同的方式输出结果,进一步掌握设计、实现较大系统的完整进程,包括系统分析、编码设计、系统集成、和调试分析,熟练掌握数据结构的选择、设计、实现和操作方式,为进一步的应用开发打好基础。 程序分析设计函数成立稀疏矩阵及初始化值和输出稀疏矩阵的值本模块要求设计函数成立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。第一要概念两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数别离在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处置,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变

3、量进行动态的地址分派。在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情形,别离编制函数,才能准确的输出稀疏矩阵。在对稀疏矩阵进行初始化及输出值时,均只输出非零元素的值和它所在的所在行及所在列。构造函数进行稀疏矩阵的转置并输出结果本模块要求设计函数进行稀疏矩阵的转置并输出转置后的结果,由于对稀疏函数的转置只对一个矩阵进行操作,所以实现起来难度不是专门大,函数也比较容易编写。在编写函数时,要先概念一个相应的结构体变量用于寄存转置后的矩阵,最后把此矩阵输出。构造函数进行两个稀疏矩阵相加及相乘并输出最终的稀疏矩阵本模块要求设计相加和相乘函数对两个矩阵进行运算,并输出最终的稀疏矩阵,在进行运算前,要

4、对两个矩阵进行检查,看是不是相同类型的矩阵,因为两个矩阵相加要求两个矩阵必然是同一类型的矩阵,概念相应的矩阵类型用于寄存两个矩阵相加相乘后的结果矩阵,那个结果矩阵的行数列数需要综合多方面情形来肯定。这四个函数也是整个程序的难点,需要灵活运用数组及指针的特点。退出系统本模块要求设置选项能随时结束程序的运行,本程序中采用exit(0)函数。程序以用户和运算机的对话方式执行,即在运算机终端上显示“提示信息”以后,由用户在键盘上输入演示程序中需要的相关信息及命令。 概要设计主界面设计为了实此刻两种存储结构下对稀疏矩阵的多种算法功能的管理,第一设计一含有多个菜单项的主控菜单子程序以链接系统的各项子功能,

5、方便用户交互式利用本系统。本系统主控菜单运行界面如图1所示。图1主界面图存储结构设计本系统采用三元组结构和十字链表结构存储稀疏矩阵的具体信息。其中:在三元组中,所有元素的信息用数组表示,每一个数组元素中包括有行下标(i),列下标(j)和对应的数值(e),它们是整型数据,全数的信息用在十字链表中,全数结点的信息用结构体(TSMatrix)包括,包括用数组(Triple dataMAXSIZE)和总共的行数(mu),列数(nu)和非零元素的个数(tu)。在十字链表下,头结点为指针数组的十字链表存储;每一个结点里面包括行下标(i),列下标(j)和对应的数值(e),它们是整型数据,还有两个指针(rig

6、ht)、(down),属于OLNode结构体。全数的信息用结构体(crosslist)包括,包括指针数组(OLink* rhead和*chead)和总共的行数(mu),列数(nu)和非零元素的个数(tu)。三元组结构体概念: typedef structint i,j;int e;Triple;typedef structTriple dataMAXSIZE; int rposMAXSIZE + 1; int nu,mu,tu;TSMatrix; 十字链表结构体概念: typedef struct OLNodeint i,j;int e;struct OLNode *right,*down;O

7、LNode,*OLink;typedef struct int mu,nu,tu;OLink *rhead,*chead;CrossList; 系统功能设计本系统除要完成份别在三元组存储结构和在十字链表下实现稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的成立及初始化在三元组存储结构下,由函数 void CreateSMatrix(TSMatrix &M)实现,在十字链表存储结构下,由函数void CreateSMatix_OL(CrossList &M)依据读入的行数和列数和非零元素的个数,别离设定每一个非零元素的信息。4个子功能的设计描述如下。(1)稀疏矩阵的转置:此功能在三元组存

8、储结构下,由函数void TransposeSMatrix(TSMatrix M,TSMatrix &T)实现,在十字链表存储结构下,由函数void TurnSMatrix_OL(CrossList &M)实现。当用户选择该功能,系统提示用户初始化一个矩阵,然后进行转置,最终输出结果。(2)稀疏矩阵的加法:此功能在三元组存储结构下,由函数void AddTMatix(TSMatrix M,TSMatrix T,TSMatrix &S)实现,在十字链表存储结构下,由函数int SMatrix_ADD(CrossList *A,CrossList *B)实现。当用户选择该功能,系统即提示用户初始化

9、要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。(3)稀疏矩阵的乘法:此功能在三元组存储结构下,由函数int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q)实现。在十字链表存储结构下,由函数int MultSMatrix_OL(CrossList M, CrossList N, CrossList &Q)实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后取得结果。(4)退出:即退出稀疏矩阵的应用系统,由exit(0)函数实现。当用户选择该功能,则退出该稀疏矩阵的应用系统。调试分析系统运行主界面系统运行

10、主界面如图2所示:图2 主界面图 各子功能测试运行结果(以三元组为例)(1)稀疏矩阵的创建及初始化:在主菜单下,用户输入1回车,是用三元组创建稀疏矩阵,按照屏幕提示初始化一个稀疏矩阵,按enter键,运行结果如图3所示。 图3 三元组创建并初始化矩阵(2)稀疏矩阵的转置:用三元组创建稀疏矩阵后,用户输入1回车,便显示该矩阵的转置矩阵,运行结果如图4所示。图4 三元组稀疏矩阵转置结果示用意(3)稀疏矩阵的相加:用三元组创建并初始化一个稀疏矩阵后,输入2回车,按屏幕提示输入第二个同类型的稀疏矩阵,按enter键,运行结果如图5所示。图5 三元组稀疏矩阵相加结果示用意(4)稀疏矩阵的相乘:用三元组创

11、建并初始化一个稀疏矩阵后,输入3回车,按屏幕提示输入第二个同类型的稀疏矩阵,按enter键,运行结果如图6所示。图6三元组稀疏矩阵相乘结果示用意(5)退出:在主菜单下,用户输入3回车,或在下级菜单中输入4回车,退出程序。运行结果如图7,图8。图7 主菜单退出程序图图8 下级菜单退出程序图总结由于本程序要求用两种办法对稀疏矩阵进行运算,专门是用十字链表这种形式来对稀疏矩阵进行运算,是实现起来有很多困难,主要包括:1、书上这种方面的东西不多,资料少,能够参考的东西不是很多;2、用十字链表进行运算比较复杂,难度较大,需要对指针掌握较好;3、在书写课程设计报告时,没有具体的模板,感觉无从下手。针对上述

12、困难,我通过网络,图书馆找资料,借鉴他人的以往的优秀的课程设计报告,和同窗们一路讨论,慢慢地解决自己的问题。 通过这次课程设计,使我对本学期学的数据结构有了更深的了解,也使自己的所学加倍牢固,并能够把更方面的知识综合起来运用。附录:程序源代码#include#include#define MAXSIZE 100int num100;typedef struct OLNodeint i,j;int e;struct OLNode *right,*down;OLNode,*OLink;typedef struct int mu,nu,tu;OLink *rhead,*chead;CrossList

13、; ,&i.j,&i.e); if(i.i=0)|i.j=0) printf(输入错误,请从头输入); scanf(%d%d%d,&i.i,&i.j,&i.e); ;=col)q.i=p.j;q.j=p.i;q.e=p.e;q+;,mcount.j,tcount.i,tcount.j) =mcount.e;tcount.i或mcount.jtcount.i或mcount.jtcount.j q.i=tcount.i; q.j=tcount.j;+tcount.e;=ce; q.i=mcount.i; q.j=mcount.j; q+; mcount+; tcount+; else mcount

14、+; tcount+; break; while(mcount=q.e=mcount.e;q.i=mcount.i;q.j=mcount.j;q+;mcount+; =tcount.e; q.i=tcount.i; q.j=tcount.j; q+; tcount+; ; if(brow t = brow+1; else t = + 1; for(q = brow; q t; +q) ccol = q.j; ctempccol += p.e * q.e; = arow, .j = ccol, .e = ctempccol; return 1;=col)printf(%4d %4d %4dn,p

15、.i,p.j,p.e);/三元组显示void TurnSMatrix_OL(CrossList &M)int col,row; /概念循环变量OLink p,q; /概念OLink结构类型变量for(col=1;coli;p-i=p-j;p-j=row;q=p-right;p-right=p-down;p-down=q;/十字链表转置int SMatrix_ADD(CrossList *A,CrossList *B)OLNode *pa,*pb,*pre,*p,*cp100; /概念OLNode类型的变量int i,j,t;t=A-tu+B-tu;for(j=1;jnu;j+)cpj=A-ch

16、eadj;/将A矩阵的列表头指针赋给cp数组for(i=1;imu;i+)pa=A-rheadi;pb=B-rheadi;/将A,B矩阵的行表头指针别离赋给pa,pbpre=NULL;while(pb)/当pb不等于零 if(pa=NULL|pa-jpb-j)p=(OLink)malloc(sizeof(OLNode);/给p动态分派空间if(!pre)A-rheadi=p;else pre-right=p;p-right=pa;pre=p;p-i=i;p-j=pb-j;p-e=pb-e;if(!A-cheadp-j)A-cheadp-j=cpp-j=p;p-down=NULL;/若是A-ch

17、eadp-j不等于零,则把p赋给它及cpp-jelsecpp-j-down=p;cpp-j=p;pb=pb-right;/不然把p赋给cpp-jelse if(pa-jj)pre=pa; pa=pa-right; else if(pa-e+pb-e) t-; pa-e+=pb-e; pre=pa; pa=pa-right; pb=pb-right; else t=t-2; if(!pre)A-rheadi=pa-right; else pre-right=pa-right; p=pa;pa=pa-right; if(A-cheadp-j=p)A-cheadp-j=cpp-j=p-down; e

18、lse cpp-j-down=p-down; free(p); pb=pb-right;A-mu=A-muB-mu?A-mu:B-mu;A-nu=A-nuB-nu?A-nu:B-nu;/A的行与列为A及B当中较大的一个return 1;/十字链表相加int MultSMatrix_OL(CrossList M, CrossList N, CrossList &Q) int i, j, e; /中间变量 OLink p0, q0, p, pl, pla; /中间变量 if != /检查稀疏矩阵M的列数和N的行数是不是对应相等 printf ( 稀疏矩阵A的列数和B的行数不相等,不能相乘。n );

19、 return 0; = , = , = 0; if(! = (OLink *)malloc( + 1) * sizeof(OLink) exit(-2); if(! = (OLink *)malloc( + 1) * sizeof(OLink) exit(-2); for(i = 1; i = ; i+) i = NULL; for(i = 1; i = ; i+) i = NULL; /相乘 for(i =1; i = ; i+) for(j = 1; j j q0-i) q0 = q0-down; /M的列大于N的行,则N的列指针后移 else if(p0-j i) p0 = p0-ri

20、ght;/M的列小于N的行,则M的行指针右移 else /M的行等于N的列 e += p0-e * q0-e; /乘积累加 q0 = q0-down, p0 = p0-right; /移动指针 if(e) /乘积不为 if(!(p = (OLink)malloc(sizeof(OLNode) exit(-2); +;/非零元素增加 p-i = i, p-j = j, p-e = e, p-right = NULL, p-down = NULL;/赋值,指针后移 /将p插入十字链表,行插入 ifi = NULL) /若p为该行的第个结点 i = pl = p; /p插在该行的表头且pl指向p(该

21、行的最后一个结点) else pl-right = p, pl = p; /插在pl所指结点以后,pl右移 /列插入 ifj = NULL) /若p为该列的第一个结点 j = p; /该列的表头指向p else /插在列表尾 pla = j;/pla指向j行的第个结点 while(pla-down) pla = pla-down;/pla指向j行最后一个结点 pla-down = p; return 1;/十字链表相乘int ShowMAtrix(CrossList *A) int col; OLink p; for(col=1;colmu;col+)if(A-rheadcol)p=A-rhe

22、adcol; while(p)printf(%3d%3d%3dn,p-i,p-j,p-e);p=p-right; return 1;/十字链表显示void main()int n,i;TSMatrix M,T,S;CrossList MM,TT,SS;printf( *稀疏矩阵应用*);printf(n请你选择创建稀疏矩阵的方式:n1:用三元组创建稀疏矩阵n2:用十字链表创建稀疏矩阵n3:退出程序);printf(n);scanf(%d,&n);switch(n)case 1:CreateSMatrix(M);printf(您输入的稀疏矩阵为(只列出非零元素):n 行 列 大小n);ShowT

23、Matrix(M);printf(已经选择三元组创建稀疏矩阵,请选择操作:n1:稀疏矩阵转置n2:稀疏矩阵相加n3:稀疏矩阵相乘n4:退出程序n);scanf(%d,&i);switch(i)case 1:TransposeSMatrix(M,T);printf(转置后的矩阵为(只列出非零元素):n 行 列 大小n);ShowTMatrix(T);break;case 2:printf(请你输入另一个稀疏矩阵:); CreateSMatrix(T); AddTMatix(M,T,S);printf(相加后的矩阵为(只列出非零元素):n 行 列 大小n); ShowTMatrix(S); bre

24、ak;case 3:printf(请你输入另一个稀疏矩阵:); CreateSMatrix(T); MultSMatrix(M,T,S); printf(相乘后的矩阵为(只列出非零元素):n 行 列 大小n); ShowTMatrix(S); break;case 4: exit(0);break;case 2:CreateSMatix_OL(MM); printf(您输入的稀疏矩阵为(只列出非零元素):n 行 列大小n); ShowMAtrix(&MM); printf(已经选择十字链表创建稀疏矩阵,请选择操作:n1:稀疏矩阵转置n2:稀疏矩阵相加n3:稀疏矩阵相乘n4:退出程序n);sca

25、nf(%d,&i);switch(i)case 1: TurnSMatrix_OL(MM); printf(转置后的矩阵为(只列出非零元素):n 行 列大小n); ShowMAtrix(&MM); break;case 2: printf(请你输入另一个稀疏矩阵:); CreateSMatix_OL(TT); SMatrix_ADD(&MM,&TT); printf(相加后的矩阵为(只列出非零元素):n 行 列大小n); ShowMAtrix(&MM);break;case 3:printf(请你输入另一个稀疏矩阵:); CreateSMatix_OL(TT); MultSMatrix_OL(MM,TT,SS); printf(相乘后的矩阵为(只列出非零元素):n 行 列大小n); ShowMAtrix(&SS);break;case 4:exit(0); ;break;case 3:exit(0);default :printf(erorr);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1