数据结构课程设计稀疏矩阵实现与应用.docx
- 文档编号:4921623
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:29
- 大小:240.84KB
数据结构课程设计稀疏矩阵实现与应用.docx
《数据结构课程设计稀疏矩阵实现与应用.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计稀疏矩阵实现与应用.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构课程设计稀疏矩阵实现与应用
安徽省巢湖学院计算机与信息工程学院
课程设计报告
课程名称《数据结构》
课题名称稀疏矩阵实现与应用
专业计算机科学与技术
班级
学号
姓名
联系方式
指导教师
2011年12月25日
目录
1、数据结构课程设计任务书1
1.1、题目-------------------------------------------------------------------------------------------------1
1.2、要求-------------------------------------------------------------------------------------------------1
2、总体设计-------------------------------------------------------------------------------------------------1
2.1、功能模块设计--------------------------------------------------------------------------------------1
2.2、所有功能模块的流程图--------------------------------------------------------------------------2
3、详细设计----------------------------------------------------------------------------------------------------3
3.1、程序中所采用的数据结构及存储结构的说明---------------------------------------------10
3.2、算法的设计思想----------------------------------------------------------------------------------10
3.3、稀疏矩阵各种运算的性质变换----------------------------------------------------------------10
4、调试与测试:
--------------------------------------------------------------------------------------------10
4.1、调试方法与步骤:
-----------------------------------------------------------------------------10
4.2、测试结果的分析与讨论:
----------------------------------------------------------------------11
5、时间复杂度的分析:
-----------------------------------------------------------------------------------12
6、源程序清单和执行结果--------------------------------------------------------------------------------12
7、C程序设计总结-----------------------------------------------------------------------------------------20
8、致谢--------------------------------------------------------------------------------------------------------20
9、参考文献--------------------------------------------------------------------------------------------------20
1、数据结构课程设计任务书
1.1、题目
实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。
1.2、要求
(1).设计函数建立稀疏矩阵,初始化值;
(2).设计函数输出稀疏矩阵的值;
(3).构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵;
(4).构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵;
(5).构造函数进行稀疏矩阵的转置,并输出结果;
(6).退出系统。
2、总体设计
2.1、功能模块设计
2.2、所有功能模块的流程图
3、详细设计
1.定义程序中所有用到的数据及其数据结构,及其基本操作的实现;
typedefstruct{
inti,j;
inte;
}Triple;//定义三元组的元素
typedefstruct{
Tripledata[MAXSIZE+1];
intmu,nu,tu;
}TSMatrix;//定义普通三元组对象
typedefstruct{
Tripledata[MAXSIZE+2];
intrpos[MAXROW+1];
intmu,nu,tu;
}RLSMatrix;//定义带链接信息的三元组对象
typedefstructOLNode{//定义十字链表元素
inti,j;
inte;
structOLNode*right,*down;//该非零元所在行表和列表的后继元素
}OLNode,*OLink;//定义十字链表元素
typedefstruct{//定义十字链表对象结构体
OLink*rhead,*chead;
intmu,nu,tu;//系数矩阵的行数,列数,和非零元素个数
}CrossList;//定义十字链表对象结构体
2.主函数
intmain()
{
intt;
cout.fill('*');
cout< cout.fill(''); cout< cout.fill('*'); cout< cout.fill(''); cout<<"请选择要进行的操作: "< cout<<"1: 矩阵的转置。 "< cout<<"2: 矩阵的加法。 "< cout<<"3: 矩阵的乘法。 "< cout<<"4: 退出程序。 "< while(t) { cout<<"请输入您要进行的操作: "< cin>>t; switch(t) { case1: TransposeSMatrix();//调用矩阵转置函数 break; case2: AddSMatrix();//调用矩阵相加函数 break; case3: MultSMatrix();//调用矩阵相乘函数 break; case4: t=0; break; } } return0; } 矩阵的转置函数 boolTransposeSMatrix()//求矩阵的转置矩阵 { TSMatrixM,T;//定义预转置的矩阵 InPutTSMatrix(M,0);//输入矩阵 intnum[MAXROW+1]; intcpot[MAXROW+1];//构建辅助数组 intq,p,t; T.tu=M.tu; T.mu=M.nu; T.nu=M.mu; if(T.tu) { for(intcol=1;col<=M.nu;col++)num[col]=0; for(t=1;t<=M.tu;t++)++num[M.data[t].j]; cpot[1]=1; for(inti=2;i<=M.nu;i++)cpot[i]=cpot[i-1]+num[i-1];//求出每一列中非零元素在三元组中出现的位置 for(p=1;p<=M.tu;p++) { intcol=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } } cout<<"输入矩阵的转置矩阵为"< OutPutSMatrix(T); returntrue; } boolCount(RLSMatrix&T){ intnum[MAXROW+1]; for(introw=1;row<=T.mu;row++)num[row]=0; for(intcol=1;col<=T.tu;col++)++num[T.data[col].i]; T.rpos[1]=1; for(inti=2;i<=T.mu;i++)T.rpos[i]=T.rpos[i-1]+num[i-1];//求取每一行中非零元素在三元组中出现的位置 returntrue; } 矩阵的乘法函数 boolMultSMatrix()//两个矩阵相乘 { RLSMatrixM,N,Q;//构建三个带“链接信息”的三元组表示的数组 InPutTSMatrix(M,1);//用普通三元组形式输入数组 InPutTSMatrix(N,1); Count(M); Count(N); cout<<"输入的两矩阵的乘矩阵为: "< if(M.nu! =N.mu)returnfalse; Q.mu=M.mu; Q.nu=N.nu; Q.tu=0;//Q初始化 intctemp[MAXROW+1];//辅助数组 intarow,tp,p,brow,t,q,ccol; if(M.tu*N.tu)//Q是非零矩阵 { for(arow=1;arow<=M.mu;arow++) { ///memset(ctemp,0,N.nu); for(intx=1;x<=N.nu;x++)//当前行各元素累加器清零 ctemp[x]=0; Q.rpos[arow]=Q.tu+1;//当前行的首个非零元素在三元组中的位置为此行前所有非零元素+1 if(arow elsetp=M.tu+1; for(p=M.rpos[arow];p { brow=M.data[p].j;//在N中找到i值也操作元素的j值相等的行 if(brow elset=N.tu+1; for(q=N.rpos[brow];q { ccol=N.data[q].j; ctemp[ccol]+=M.data[p].e*N.data[q].e;//将乘得到对应值放在相应的元素累加器里面 } } for(ccol=1;ccol<=Q.nu;ccol++)//对已经求出的累加器中的值压缩到Q中 if(ctemp[ccol]) { if(++Q.tu>MAXSIZE)returnfalse; Q.data[Q.tu].e=ctemp[ccol]; Q.data[Q.tu].i=arow; Q.data[Q.tu].j=ccol; } } } OutPutSMatrix(Q); returntrue; } 矩阵的加法函数 boolAddSMatrix()//矩阵的加法 { CrossListM,N;//创建两个十字链表对象,并初始化 CreateSMatrix_OL(M); CreateSMatrix_OL(N); cout<<"输入的两矩阵的和矩阵为: "< OLinkpa,pb,pre,hl[MAXROW+1];//定义辅助指针,pa,pb分别为M,N当前比较的元素,pre为pa的前驱元素 for(intx=1;x<=M.nu;x++)hl[x]=M.chead[x]; for(intk=1;k<=M.mu;k++)//对M的每一行进行操作 { pa=M.rhead[k]; pb=N.rhead[k]; pre=NULL; while(pb)//把N中此行的每个元素取出 { OLinkp; if(! (p=(OLink)malloc(sizeof(OLNode))))exit(0);//开辟新节点,存储N中取出的元素 p->e=pb->e; p->i=pb->i; p->j=pb->j; if(NULL==pa||pa->j>pb->j)//当M此行已经检查完或者pb因该放在pa前面 { if(NULL==pre) M.rhead[p->i]=p; else pre->right=p; p->right=pa; pre=p; if(NULL==M.chead[p->j])//进行列插入 { M.chead[p->j]=p; p->down=NULL; } else { p->down=hl[p->j]->down; hl[p->j]->down=p; } hl[p->j]=p; pb=pb->right; } else if((NULL! =pa)&&pa->j { pre=pa; pa=pa->right; } else if(pa->j==pb->j)//如果pa,pb位于同一个位置上,则将值相加 { pa->e+=pb->e; if(! pa->e) {//如果相加后的和为0,则删除此节点,同时改变此元素坐在行,列的前驱元素的相应值 if(NULL==pre)//修改行前驱元素值 M.rhead[pa->i]=pa->right; else pre->right=pa->right; p=pa; pa=pa->right; if(M.chead[p->j]==p)M.chead[p->j]=hl[p->j]=p->down;//修改列前驱元素值 else hl[p->j]->down=p->down; free(p); pb=pb->right; } else { pa=pa->right; pb=pb->right; } } } } OutPutSMatrix_OL(M); returntrue; } 创建十字链表 boolCreateSMatrix_OL(CrossList&M)//创建十字链表 { intx,y,m; cout<<"请输入矩阵的行,列,及非零元素个数"< cin>>M.mu>>M.nu>>M.tu; if(! (M.rhead=(OLink*)malloc((M.mu+1)*sizeof(OLink))))exit(0); if(! (M.chead=(OLink*)malloc((M.nu+1)*sizeof(OLink))))exit(0); for(x=0;x<=M.mu;x++) M.rhead[x]=NULL;//初始化各行,列头指针,分别为NULL for(x=0;x<=M.nu;x++) M.chead[x]=NULL; cout<<"请按三元组的格式输入数组: "< for(inti=1;i<=M.tu;i++) { cin>>x>>y>>m;//按任意顺序输入非零元,(普通三元组形式输入) OLinkp,q; if(! (p=(OLink)malloc(sizeof(OLNode))))exit(0);//开辟新节点,用来存储输入的新元素 p->i=x; p->j=y; p->e=m; if(M.rhead[x]==NULL||M.rhead[x]->j>y) { p->right=M.rhead[x]; M.rhead[x]=p; } else { for(q=M.rhead[x];(q->right)&&(q->right->j p->right=q->right; q->right=p;//完成行插入 } if(M.chead[y]==NULL||M.chead[y]->i>x) { p->down=M.chead[y]; M.chead[y]=p; } else { for(q=M.chead[y];(q->down)&&(q->down->i p->down=q->down; q->down=p;//完成列插入 } } returntrue; } 十字链表的输出 boolOutPutSMatrix_OL(CrossListT)//输出十字链表,用普通数组形式输出 { for(inti=1;i<=T.mu;i++) { OLinkp=T.rhead[i]; for(intj=1;j<=T.nu;j++) { if((p)&&(j==p->j)) { cout< p=p->right; }else cout< } cout< } returntrue; } 3.1、程序中所采用的数据结构的说明 ADTSparseMatrix{ 数据对象: D={aij|i=1,2,…,m;j=1,2,..,n; aij∈Elemset,m和n分别称为矩阵的行数和列数。 } 数据关系: R={Row,Col} Row={ Col={ 基本操作: CreateSMatrix(&M); 操作结果: 创建稀疏矩阵M。 DestroySMatrix(&M); 初始条件: 稀疏矩阵M存在。 操作结果: 销毁稀疏矩阵M。 PrintSMatrix(M); 初始条件: 稀疏矩阵M存在。 操作结果: 输出稀疏矩阵M。 AddSMatrix(M,N,&Q); 初始条件: 稀疏矩阵M与N的行数和列数对应相等操作结果: 求稀疏矩阵的和Q=M+N。 MultSMatrix(M,N,&Q); 初始条件: 稀疏矩阵M的列数等于N的行数。 操作结果: 求稀疏矩阵乘积Q=M*N。 TransposeSMatrix(M,&T); 初始条件: 稀疏矩阵M存在。 操作结果: 求稀疏矩阵M的转置矩阵T。 }ADTSparseMatrix 3.2、算法的设计思想 本实验要求在三元组,十字链表下实现稀疏矩阵的加、转、乘。 首先要进行矩阵的初始化操作,定义三元组和十字链表的元素对象。 写出转置,加法,乘法的操作函数。 通过主函数调用实现在一个程序下进行矩阵的运算操作。 3.3、稀疏矩阵各种运算的性质变换 a)加法运算 两个稀疏矩阵的加和矩阵仍然是稀疏矩阵 b)乘法运算 两个稀疏矩阵的乘积矩阵不是稀疏矩阵 c)转置运算 一个稀疏矩阵的转置矩阵仍然是稀疏矩阵 4、调试与测试: 4.1、调试方法与步骤: 1.实际完成的情况说明(完成的功能,支持的数据类型等); 完成了稀疏矩阵的建立,初始化及输出值的操作。 实现三元组,十字链表下的稀疏矩阵的加法,乘法以及转置运算。 2.程序的性能分析,包括时空分析; 能应对一般小的错误输入,如果复杂则自动退出程序。 3.上机过程中出现的问题及其解决方案; 1.起始有错误,设定的变量名相同。 经检查,改正。 2.一些逻辑错误。 经讨论改正。 运行出现部分语法错误修正 4.程序中可以改进的地方说明; 程序在运行中一旦出现矩阵数据格式错误如输入汉字,则程序自动退出。 需要重新启动。 更新程序对更多错误输入情况的分析能力。 5.程序中可以扩充的功能及设计实现假想。 对退出操作的扩充 在主菜单下,用户输入4回车选择退出程序是,询问是否真的退出系统,如果是,则即退出系统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 稀疏 矩阵 实现 应用