数据结构实验Word格式文档下载.docx
《数据结构实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
操作结果:
建立三元列表b,并想稀疏矩阵内输入数据
addmtirx(&
a,&
b,&
c);
初始条件:
存在两个不为空稀疏矩阵和一个空的三元列表
操作结果:
将两个稀疏矩阵相加,并将得数存储在c中
transposesmatrix(&
a,&
b);
初始条件:
存在一个不为空稀疏矩阵和一个空的三元列表
将含有数据的稀疏矩阵转置,并将得数存储在b中
multmatrix(&
b,&
将两个稀疏矩阵相乘,并将得数存储在c中
submtirx(&
c)
将两个稀疏矩阵相加减,并将得数存储在c中
Output()
存放稀疏矩阵三元列表存在
输出计算后的稀疏矩阵
2.本程序包含三个模块:
(1)主程序模块;
(2)输入需要计算的稀疏矩阵
(3)选择计算方法,并计算
(4)输出计算后的矩阵
(5)模块调用图:
主程序模块
输入需要计算的稀疏矩阵
选择计算方法,并计算
输出计算后的矩阵
4详细设计
1.元素类型,列表类型和指针类型:
#include<
stdio.h>
#include<
stdlib.h>
#definemaxsize100
typedefintdatatype;
typedefstruct//定义三元组
{
inti,j;
datatypex;
}matrix;
typedefstruct//定义三元组表
matrixdata[maxsize];
intmu,nu,tu;
//矩阵行,列,非零元个数
}tripulematrix;
2.每个模块的分析:
(1)主程序模块:
voidmain()
printf("
----------------矩阵计算---------------\n"
);
请选择你需要的计算方式\n"
-----------------1.稀疏矩阵的转置---------------\n"
-----------------2.稀疏矩阵的加法---------------\n"
-----------------3.稀疏矩阵的减法---------------\n"
-----------------4.稀疏矩阵的乘法---------------\n"
-----------------5.退出---------------\n"
charx;
scanf("
%c"
&
x);
tripulematrixa,b,c;
switch(x)
{
case'
1'
:
//tripulematrixa,b;
printf("
请输入矩阵的行数与列数\n"
scanf("
%d%d"
a.mu,&
a.nu);
b.mu=a.mu;
b.nu=a.nu;
printf("
请输入一个矩阵,例如:
\n"
123\n234\n456\n"
请输入\n"
input(&
a);
transposesmatrix(&
output(&
break;
case'
2'
//tripulematrixa,b,c;
请输入两个矩阵,例如:
请输入第一个矩阵\n"
请输入第二个矩阵\n"
addmtirx(&
3'
//tripulematrixa,b,c;
;
scanf("
b.mu=a.mu;
b.nu=a.nu;
printf("
input(&
submtirx(&
break;
4'
multmatrix(&
break;
5'
exit(0);
system("
pause"
}
(2)输入数据
voidinput(tripulematrix*a)
inti,j,k=0;
for(i=0;
i<
a->
mu;
i++)
for(j=0;
j<
nu;
j++)
{
%d"
if(x)//如果是非零元
{
a->
data[k].i=i;
data[k].j=j;
a->
data[k].x=x;
k++;
}
}
a->
tu=k;
}//input
(3)加法
datatypeaddmtirx(tripulematrix*a,tripulematrix*b,tripulematrix*c)
intk=0,l=0;
c->
mu=a->
nu=a->
tu=0;
while(k<
tu&
&
l<
b->
tu)
if((a->
data[k].i==b->
data[l].i)&
(a->
data[k].j==b->
data[l].j))
inttemp=a->
data[k].x+b->
data[l].x;
if(temp!
=0)
c->
data[c->
tu].x=a->
tu].i=a->
data[k].i;
c->
tu].j=a->
data[k].j;
tu++;
k++;
l++;
else
data[k].j<
data[k].x;
k++;
else
if(((a->
data[k].j>
data[l].j))||(a->
data[k].i>
data[l].i))
tu].i=b->
data[l].i;
c->
tu].j=b->
data[l].j;
tu].x=b->
l++;
while(k<
while(l<
l++;
return
(1);
}
(4)减法
datatypesubmtirx(tripulematrix*a,tripulematrix*b,tripulematrix*c)//减法
//inttemp=a->
data[k].x-b->
//if(temp!
//{
//}
if((a->
data[l].j)||(a->
data[k].i<
else
if(((a->
{
c->
tu].x=-b->
l++;
}
while(k<
c->
while(l<
l++;
(5)转置
inttransposemartix(tripulematrix*a,tripulematrix*b)
intcol,p,q;
b->
tu=a->
tu;
if(b->
q=0;
for(col=0;
col<
col++)
for(p=0;
p<
p++)
if(a->
data[p].j==col)
b->
data[p].i=a->
data[q].j;
data[p].j=a->
data[q].i;
data[p].x=a->
data[q].x;
q++;
}//稀疏矩阵的转置算法
(六)乘法intmultmatrix(tripulematrix*a,tripulematrix*b,tripulematrix*c)
intrpos1[maxsize],rpos2[maxsize],num[maxsize],rpos3[maxsize];
introw1,row2,arow,tp,t,brow,ccol,p,q,k;
intctemp[maxsize];
if(a->
for(row1=0;
row1<
row1++)
num[row1]=0;
for(row1=0;
row1++)
++num[a->
data[row1].i];
rpos1[0]=0;
for(row1=1;
rpos1[row1]=rpos1[row1-1]+num[row1-1];
if(b->
for(row2=0;
row2<
row2++)
num[row2]=0;
for(row2=0;
row2++)++num[b->
data[row2].i];
rpos2[0]=0;
for(row2=1;
row2++)rpos2[row2]=rpos2[row2-1]+num[row2-1];
c->
nu=b->
if(a->
tu*b->
tu!
for(arow=0;
arow<
arow++)
for(k=0;
k<
maxsize;
k++)ctemp[k]=0;
rpos3[arow]=c->
tu+1;
if(arow<
mu-1)
tp=rpos1[arow+1];
tp=a->
for(p=rpos1[arow];
tp;
brow=a->
data[p].j;
//找到对应元在b中的行号
if(brow<
nu-1)
t=rpos2[brow+1];
elset=b->
for(q=rpos2[brow];
q<
t;
q++)
ccol=b->
//乘积元素在Q中的列号
ctemp[ccol]+=(a->
data[p].x)*(b->
data[q].x);
for(ccol=0;
ccol<
ccol++)
if(ctemp[ccol])
if(c->
tu>
maxsize)
return0;
tu].i=arow;
tu].j=ccol;
tu].x=ctemp[ccol];
return1;
(4)函数调用关系图
main()
input(&
submtirx(&
output();
5程序使用说明及测试结果
1.程序使用说明
(1)本程序的运行环境为VC6.0。
(2)进入演示程序后即显示提示信息:
----------------矩阵计算---------------
请选择你需要的计算方式
-----------------1.稀疏矩阵的转置---------------
-----------------2.稀疏矩阵的加法---------------
-----------------3.稀疏矩阵的减法---------------
-----------------4.稀疏矩阵的乘法---------------
-----------------5.退出---------------
1
请输入矩阵的行数与列数
33
123
111
得出:
211
311
请按任意键继续...
3.调试中的错误及解决办法。
(1)转置出现问题
(2)输出时无法利用数组第一个空间
(3)三元表定义是无rpos(每行第一个非零元位置)
解决方式:
逐步调试,以及问同学,自己更改算法,计算出rpos
6致谢
经过1个月的忙碌和努力,此次论文设计也将基本完成。
作为一个本科生的论文,由于我自身经验的匮乏及学识所限,不可避免仍有许多疏忽错漏的细节。
如果没有导师的督促指点,以及一起研究的同学们的支持和鼓励,完成这次毕业设计就将是愚公移山,断不可行。
在此次论文写作过程中,老师对我的亲切关怀和耐心指导尤其激励着我。
她恭肃的学术态度,严谨的治学精神,认真专注的工作作风,给我留下深刻的印象并成为我今后学习生活的目标。
从最初的选择课题到最终完成论文,老师都始终非常耐心的指导和帮助我。
衷心感谢各位老师在百忙中评阅本论文,并提出了宝贵意见。
本文引用了数位学者的研究文献,正是各位学者的研究成果才启发我完成了本篇论文的写作。
由于我的个人水平局限,这篇论文难免有不足之处,恳请各位老师批评指正!