数据结构课程设计稀疏矩阵运算器.docx
《数据结构课程设计稀疏矩阵运算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计稀疏矩阵运算器.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计稀疏矩阵运算器.docx](https://file1.bdocx.com/fileroot1/2023-1/31/33ac128c-4596-4204-a838-81dab0848e9a/33ac128c-4596-4204-a838-81dab0848e9a1.gif)
数据结构课程设计稀疏矩阵运算器
成绩评定
教师签名
嘉应学院计算机学院
实验报告
课程名称:
数据结构课程设计
开课学期:
2017-2018学年第2学期
班级:
指导老师:
实验题目:
稀疏矩阵运算器
学号:
姓名:
上机时间:
【实验目的】深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。
【需要分析】稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
要求以带“行逻辑链接信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。
输入以三元组表示,输出以通常的阵列形式列出。
【软件平台】
Windows2000,VisualC++6.0或WINTC
【概要设计】
ADTArray{
数据对象:
D={aij|0≤i≤b1-1,0≤j≤b2-1}
数据关系:
R={ROW,COL}
ROW={|0≤i≤b1-2,0≤j≤b2-1}
COL={|0≤i≤b1-1,0≤j≤b2-2}
基本操作:
CreateSMatrix(&M);//操作结果:
创建稀疏矩阵M.
PrintSMatrix(M);
//初始化条件:
稀疏矩阵M存在.
//操作结果:
输出稀疏矩阵M.
AddSMatrix(M,N,&Q);
//初始化条件:
稀疏矩阵M与N的行数和列数对应相等.
//操作结果:
求稀疏矩阵的和Q=M+N.
SubSMatrix(M,N,&Q);
//初始化条件:
稀疏矩阵M与N的行数和列数对应相等.
//操作结果:
求稀疏矩阵的差Q=M-N.
MultSMatrix(M,N,&Q);
//初始化条件:
稀疏矩阵M的列数等于N的行数.
//操作结果:
求稀疏矩阵的乘积Q=M*N.
}ADTArray
【主程序模块】:
voidmain()
{
初始化;
do{
接受命令;
处理命令;
}while(命令!
=“退出”);
}
【功能模块调用关系图】
【详细设计】
typedefstruct{
introw;//行数
intcol;//列数
intv;//非零元素值
}triplenode;
typedefstruct{
triplenodedata[maxsize+1];//非零元三元组
introwtab[maxrow+1];//各行第一个非零元的位置表
intmu,nu,tu;//矩阵的行数、列数和非零元个数
}rtripletable;
voidcreat(rtripletable&A)//创建稀疏矩阵
voidprint(rtripletableA)//输出稀疏矩阵
intaddsmatrix(rtripletableM,rtripletableN)//矩阵相加
intsubsmatrix(rtripletableM,rtripletableN)//稀疏矩阵相减
voidmultsmatrix(rtripletableM,rtripletableN,rtripletable&Q)//稀疏矩阵相乘
【调试分析】
1、由于开始对顺序存储的知识还不熟识,在三元组的存储和运用会导致算法低效。
2、做到存储的时候,开始时不知道怎样存储三元组,和不知如何去运用它的行数,列数,非零元素。
3、在使用选择和循环时,有时因为自己的粗心,把循环的条件弄错了。
4、做本程序用到了数组的知识,有时一有不懂的东西又只能打开书来看。
5、开始时没有把矩阵的加法和减法的情况考虑全面,导致输出的时候会出现简单的错误。
【用户手册】
1、本程序的运行环境为Windowsme下的MicrosofeVC++6.0,执行文件为:
xishujuzhen.cpp。
2、进入演示程序后即显示文本方式的用户界面:
3、进入界面后,只要选择数字命令按“回车键”就行。
4、接受其他命令后即执行相应的操作和相应的结果。
完整代码如下:
#include
#include
#include
#definemaxsize100
#definemaxrow100
#defineOK1
#defineERROR-1
typedefstruct{
introw;//行数
intcol;//列数
intv;//非零元素值
}triplenode;
typedefstruct{
triplenodedata[maxsize+1];//非零元三元组
introwtab[maxrow+1];
//各行第一个非零元的位置表
intmu,nu,tu;//矩阵的行数、列数和非零元个数
}rtripletable;
voidcreat(rtripletable&A)//创建稀疏矩阵
{
intk=1,sum=1,loop,p,t;
intnum[maxrow+1];
cout<<"请输入矩阵的行数和列数:
"<cout<<"行数:
";cin>>A.mu;
cout<<"列数:
";cin>>A.nu;
cout<<"非零元素个数:
";cin>>A.tu;
cout<<"请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记!
"<for(loop=1;loop<=A.tu;loop++)
{
cin>>A.data[loop].row>>A.data[loop].col>>A.data[loop].v;
//输入三元组的行数,列数和非零元素值
}
for(p=1;p<=A.mu;p++)num[p]=0;
//A三元组每一列的非零元素个数
for(t=1;t<=A.tu;t++)++num[A.data[t].row];
//求A中每一列含非零元个数
A.rowtab[1]=1;
//求第p列中第一个非零元在A.data中的序号
for(t=2;t<=A.mu;t++)A.rowtab[t]=A.rowtab[t-1]+num[t-1];
return;
}
voidprint(rtripletableA)//输出稀疏矩阵
{
intresult[maxrow+1][maxrow+1];
//定义一个二维数组
intloop1,loop2;
for(loop1=1;loop1<=A.mu;loop1++)
for(loop2=1;loop2<=A.nu;loop2++)
result[loop1][loop2]=0;//初始化为0
for(loop1=1;loop1<=A.tu;loop1++)
result[A.data[loop1].row][A.data[loop1].col]=A.data[loop1].v;
for(loop1=1;loop1<=A.mu;loop1++)
{
cout<<"|";
for(loop2=1;loop2<=A.nu;loop2++)
cout<//输出所做运算的结果
cout<<"|"<}
}
intaddsmatrix(rtripletableM,rtripletableN)
//矩阵相加
{
if(M.mu!
=N.mu)//行数相等才能相加
cout<<"出错";
rtripletableQ;Q.mu=M.mu;Q.nu=N.nu;
intp,q,k;
p=1;q=1;k=1;
while(p<=M.tu&&q<=N.tu)//两个稀疏矩阵存在
{
if(M.data[p].row==N.data[q].row)
//两个稀疏矩阵的行数相等
{
if(M.data[p].col==N.data[q].col)
//两个稀疏矩阵的列数相等
{
if(M.data[p].v+N.data[q].v!
=0)
//两个稀疏矩阵相加的结果不为0
{
Q.data[k].row=M.data[p].row;
Q.data[k].col=M.data[p].col;
Q.data[k].v=M.data[p].v+N.data[q].v;++k;
}
++q;++p;
}
elseif(M.data[p].col//第一个稀疏矩阵列数小于第二个稀疏矩阵列数
{
Q.data[k]=M.data[p];
//把M中的所有信息都赋给Q
++p;++k;
}
else
//第一个稀疏矩阵列数大于第二个稀疏矩阵的列数
{
Q.data[k]=N.data[q];++q;++k;
}
}
elseif(M.data[p].row//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数
{
Q.data[k]=M.data[p];++p;++k;
}
else
//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数
{
Q.data[k]=N.data[q];++q;++k;
}
}
while(p<=M.tu)//只有M并且符合条件
{
Q.data[k]=M.data[p];++p;++k;
}
while(q<=N.tu)//只有N并且符合条件
{
Q.data[k]=N.data[q];
++q;++k;
}
Q.tu=k-1;
cout<<"加法结果为:
"<print(Q);//调用print()
returnOK;
}
intsubsmatrix(rtripletableM,rtripletableN)
//稀疏矩阵相减
{
if(M.mu!
=N.mu)//行数相等才能相加
cout<<"出错";
rtripletableQ;
Q.mu=M.mu;
Q.nu=N.nu;
intp,q,k;
p=1;q=1;k=1;
while(p<=M.tu&&q<=N.tu)//两个稀疏矩阵存在
{
if(M.data[p].row==N.data[q].row)
//两个稀疏矩阵的行数相等
{
if(M.data[p].col==N.data[q].col)
//两个稀疏矩阵的列数相等
{
if(M.data[p].v-N.data[q].v!
=0)
//两个稀疏矩阵相减的结果不为0
{Q.data[k].row=M.data[p].row;
Q.data[k].col=M.data[p].col;
Q.data[k].v=M.data[p].v-N.data[q].v;
++k;
}
++q;++p;
}
if(M.data[p].col//第一个稀疏矩阵列数小于第二个稀疏矩阵的列数
{
Q.data[k]=M.data[p];
++p;++k;
}
if(M.data[p].col>N.data[q].col)
//第一个稀疏矩阵列数大于第二个稀疏矩阵的列
{
Q.data[k].row=N.data[q].row;
Q.data[k].col=N.data[q].col;
Q.data[k].v=-N.data[q].v;
++q;++k;
}
}
if(M.data[p].row//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数
{
Q.data[k]=M.data[p];
++p;++k;
}
if(M.data[p].row>N.data[q].row)
//第一个稀疏矩阵行列数大于第二个稀疏矩阵行数
{
Q.data[k].row=N.data[q].row;
Q.data[k].col=N.data[q].col;
Q.data[k].v=-N.data[q].v;++q;++k;
}
}
while(p<=M.tu)//只有M并且符合条件
{
Q.data[k]=M.data[p];++p;++k;
}
while(q<=N.tu)//只有N并且符合条件
{
Q.data[k].row=N.data[q].row;
Q.data[k].col=N.data[q].col;
Q.data[k].v=-N.data[q].v;
++q;++k;
}
Q.tu=k-1;
cout<<"减法结果为:
"<print(Q);//调用print()
returnOK;
}
voidmultsmatrix(rtripletableM,rtripletableN,rtripletable&Q)//稀疏矩阵相乘
{
intarow,brow;
intp,q,tp,t;
intccol;
intctemp[maxrow+1];//定义累加器
if(M.nu!
=N.mu)return;
Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;//Q初始化
if(M.tu*N.tu!
=0){//Q是非零矩阵
for(arow=1;arow<=M.mu;arow++)
//处理M的每一行
{
for(p=1;p<=Q.nu;p++)//处理M的每一列
ctemp[p]=0;//当前行各元素累加器清零
Q.rowtab[arow]=Q.tu+1;
if(arowelsetp=M.tu+1;
for(p=M.rowtab[arow];p//对当前行中每一个非零元
{
brow=M.data[p].col;//找到对应元N中的行号
if(browelset=N.tu+1;
for(q=N.rowtab[brow];q{
ccol=N.data[q].col;//乘积元素在Q中列数
ctemp[ccol]+=M.data[p].v*N.data[q].v;
}
}//求得Q中第crow(=arow)行的非零元
for(ccol=1;ccol<=Q.nu;ccol++)
//压缩存储该行非零元
{
if(ctemp[ccol])
{
if(++Q.tu>maxsize)return;
Q.data[Q.tu].row=arow;//行数
Q.data[Q.tu].col=ccol;//列数
Q.data[Q.tu].v=ctemp[ccol];
//累加非零元素值
}
}
}
}
cout<<"乘法结果为:
"<print(Q);//调用print()
}
voidmain()
{
charchoice;
rtripletableA,B,Q;
cout<<"--------------------------------------------------\n";
cout<<"|*****欢迎使用稀疏矩阵运算器******|\n";
cout<<"|=============================|\n";
cout<<"\n|A、输入矩阵1|\n";
cout<<"\n|B、输入矩阵2|\n";
cout<<"\n|C、矩阵相加|\n";
cout<<"\n|D、矩阵相减|\n";
cout<<"\n|E、矩阵相乘|\n";
cout<<"\n|F、退出本系统|\n";
cout<<"\n|-----------------------------------------------|\n";
cout<<"请选择所需要的操作功能(A,B,C,D,E,F):
";
do{
cin>>choice;
switch(choice){
case'A':
creat(A);break;
case'B':
creat(B);break;
case'C':
addsmatrix(A,B);break;
case'D':
subsmatrix(A,B);break;
case'E':
multsmatrix(A,B,Q);break;
case'F':
exit(0);
}cout<<"请选择所需要的操作功能(A,B,C,D,E,F):
";
}while
(1);
}