稀疏矩阵应用Word文档格式.doc
《稀疏矩阵应用Word文档格式.doc》由会员分享,可在线阅读,更多相关《稀疏矩阵应用Word文档格式.doc(15页珍藏版)》请在冰豆网上搜索。
首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。
在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情况,分别编制函数,才能准确的输出稀疏矩阵。
在对稀疏矩阵进行初始化及输出值时,均只输出非零元素的值和它所在的所在行及所在列。
2.2构造函数进行稀疏矩阵的转置并输出结果
本模块要求设计函数进行稀疏矩阵的转置并输出转置后的结果,由于对稀疏函数的转置只对一个矩阵进行操作,所以实现起来难度不是很大,函数也比较容易编写。
在编写函数时,要先定义一个相应的结构体变量用于存放转置后的矩阵,最后把此矩阵输出。
2.3构造函数进行两个稀疏矩阵相加及相乘并输出最终的稀疏矩阵
本模块要求设计相加和相乘函数对两个矩阵进行运算,并输出最终的稀疏矩阵,在进行运算前,要对两个矩阵进行检查,看是不是相同类型的矩阵,因为两个矩阵相加要求两个矩阵一定是同一类型的矩阵,定义相应的矩阵类型用于存放两个矩阵相加相乘后的结果矩阵,这个结果矩阵的行数列数需要综合多方面情况来确定。
这四个函数也是整个程序的难点,需要灵活运用数组及指针的特点。
2.4退出系统
本模块要求设置选项能随时结束程序的运行,本程序中采用exit(0)函数。
程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中需要的相关信息及命令。
l概要设计
3.1主界面设计
为了实现在两种存储结构下对稀疏矩阵的多种算法功能的管理,首先设计一含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。
本系统主控菜单运行界面如图1所示。
图1主界面图
3.2存储结构设计
本系统采用三元组结构和十字链表结构存储稀疏矩阵的具体信息。
其中:
在三元组中,所有元素的信息用数组表示,每个数组元素中包含有行下标(i),列下标(j)和对应的数值(e),它们是整型数据,全部的信息用在十字链表中,全部结点的信息用结构体(TSMatrix)包含,包括用数组(Tripledata[MAXSIZE])和总共的行数(mu),列数(nu)以及非零元素的个数(tu)。
在十字链表下,头结点为指针数组的十字链表存储;
每个结点里面包含行下标(i),列下标(j)和对应的数值(e),它们是整型数据,还有两个指针(right)、(down),属于OLNode结构体。
全部的信息用结构体(crosslist)包含,包括指针数组(OLink*rhead和*chead)和总共的行数(mu),列数(nu)以及非零元素的个数(tu)。
三元组结构体定义:
typedefstruct{
inti,j;
inte;
}Triple;
typedefstruct{
Tripledata[MAXSIZE];
intrpos[MAXSIZE+1];
intnu,mu,tu;
}TSMatrix;
十字链表结构体定义:
typedefstructOLNode{
structOLNode*right,*down;
}OLNode,*OLink;
typedefstruct{
intmu,nu,tu;
OLink*rhead,*chead;
}CrossList;
3.3系统功能设计
本系统除了要完成分别在三元组存储结构以及在十字链表下实现稀疏矩阵的初始化功能外还设置了4个子功能菜单。
稀疏矩阵的建立及初始化在三元组存储结构下,由函数voidCreateSMatrix(TSMatrix&
M)实现,在十字链表存储结构下,由函数voidCreateSMatix_OL(CrossList&
M)依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。
4个子功能的设计描述如下。
(1)稀疏矩阵的转置:
此功能在三元组存储结构下,由函数voidTransposeSMatrix(TSMatrixM,TSMatrix&
T)实现,在十字链表存储结构下,由函数voidTurnSMatrix_OL(CrossList&
M)实现。
当用户选择该功能,系统提示用户初始化一个矩阵,然后进行转置,最终输出结果。
(2)稀疏矩阵的加法:
此功能在三元组存储结构下,由函数voidAddTMatix(TSMatrixM,TSMatrixT,TSMatrix&
S)实现,在十字链表存储结构下,由函数intSMatrix_ADD(CrossList*A,CrossList*B)实现。
当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。
然后进行加法,最后输出结果。
(3)稀疏矩阵的乘法:
此功能在三元组存储结构下,由函数intMultSMatrix(TSMatrixM,TSMatrixN,TSMatrix&
Q)实现。
在十字链表存储结构下,由函数intMultSMatrix_OL(CrossListM,CrossListN,CrossList&
当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。
然后进行相乘,最后得到结果。
(4)退出:
即退出稀疏矩阵的应用系统,由exit(0)函数实现。
当用户选择该功能,则退出该稀疏矩阵的应用系统。
l调试分析
4.1系统运行主界面
系统运行主界面如图2所示:
图2主界面图
4.2各子功能测试运行结果
(以三元组为例)
(1)稀疏矩阵的创建及初始化:
在主菜单下,用户输入1回车,是用三元组创建稀疏矩阵,根据屏幕提示初始化一个稀疏矩阵,按enter键,运行结果如图3所示。
图3三元组创建并初始化矩阵
(2)稀疏矩阵的转置:
用三元组创建稀疏矩阵后,用户输入1回车,便显示该矩阵的转置矩阵,运行结果如图4所示。
图4三元组稀疏矩阵转置结果示意图
(3)稀疏矩阵的相加:
用三元组创建并初始化一个稀疏矩阵后,输入2回车,按屏幕提示输入第二个同类型的稀疏矩阵,按enter键,运行结果如图5所示。
图5三元组稀疏矩阵相加结果示意图
(4)稀疏矩阵的相乘:
用三元组创建并初始化一个稀疏矩阵后,输入3回车,按屏幕提示输入第二个同类型的稀疏矩阵,按enter键,运行结果如图6所示。
图6三元组稀疏矩阵相乘结果示意图
(5)退出:
在主菜单下,用户输入3回车,或者在下级菜单中输入4回车,退出程序。
运行结果如图7,图8。
图7主菜单退出程序图
图8下级菜单退出程序图
l总结
由于本程序要求用两种办法对稀疏矩阵进行运算,特别是用十字链表这种形式来对稀疏矩阵进行运算,是实现起来有很多困难,主要包括:
1、书上这种方面的东西不多,资料少,可以参考的东西不是很多;
2、用十字链表进行运算比较复杂,难度较大,需要对指针掌握较好;
3、在书写课程设计报告时,没有具体的模板,感觉无从下手。
针对上述困难,我通过网络,图书馆找资料,借鉴别人的以往的优秀的课程设计报告,和同学们一起讨论,逐步地解决自己的问题。
通过此次课程设计,使我对本学期学的《数据结构》有了更深的了解,也使自己的所学更加牢固,并能够把更方面的知识综合起来运用。
附录:
程序源代码
#include<
stdio.h>
stdlib.h>
#defineMAXSIZE100
intnum[100];
//十字链表结构体定义
intrpos[MAXSIZE+1];
//三元组结构体定义;
intCreateSMatix_OL(CrossList&
M){
inti,j,e;
OLinkq;
OLinkp;
printf("
请输入稀疏矩阵的行数,列数,非零元素的个数:
"
);
//矩阵行数,列数下标均从开始;
scanf("
%d%d%d"
&
M.mu,&
M.nu,&
M.tu);
M.rhead=(OLink*)malloc((M.mu+1)*sizeof(OLNode));
//分配内存空间
M.chead=(OLink*)malloc((M.nu+1)*sizeof(OLNode));
for(i=1;
i<
=M.mu;
i++)M.rhead[i]=NULL;
//把矩阵每个元素置空值
=M.nu;
i++)M.chead[i]=NULL;
printf("
请输入稀疏矩阵,如果行为0,则退出\n"
i,&
j,&
e);
while(i!
=0){
p=(OLink)malloc(sizeof(OLNode));
p->
i=i;
j=j;
e=e;
if(M.rhead[i]==NULL||M.rhead[i]->
j>
j){p->
right=M.rhead[i];
M.rhead[i]=p;
}
else{
q=M.rhead[i];
while(q->
right&
&
q->
right->
j<
j)q=q->
right;
p->
right=q->
q->
right=p;
if(M.chead[j]==NULL||M.chead[j]->
i>
i){p->
down=M.chead[j];
M.chead[j]=p;
q=M.chead[j];
while(q->
down&
down->
i)q=q->
down;
down=q->
down=p;