数据结构课程设计 矩阵多项式减法.docx
《数据结构课程设计 矩阵多项式减法.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 矩阵多项式减法.docx(19页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计 矩阵多项式减法.docx](https://file1.bdocx.com/fileroot1/2022-11/26/797db11b-c631-402d-ad07-d0899acd9a94/797db11b-c631-402d-ad07-d0899acd9a941.gif)
数据结构课程设计矩阵多项式减法
数组和链表在矩阵多项式减运算中的
应用
学生姓名:
指导老师:
摘要本次课程设计主要根据课本中介绍的的实现思想及算法编写一个程序,主要实现矩阵多项式的减法运算。
以数组、指针、线性链表等相关知识为基础,掌握并熟练运用数组及线性链表。
在程序设计中,采用线性链表的形式实现多项式的存储,输入一个多项式中项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头结点指向它,如此建立两个多项式的链表,实现减法运算。
另用数组表示一个矩阵,用矩阵代替多项式中的未知量计算两个多项式的相减结果,并进行输出显示结果。
这次课程设计的设计内容主要是通过实际的例子和程序来实现课本中所学习的算法的应用。
程序设计设计语言采用C++,程序运行平台为WindowsXP。
关键字数组;线性链表;多项式
目录
1引言3
1.1目的与意义3
1.2课程设计内容3
2开发工具简介5
3设计与实现7
3.1函数及说明7
3.2数据结构设计7
3.3流程图设计9
4测试11
4.1运行环境11
4.2多项式运算介绍11
4.3运行结果12
5结束语13
致谢14
参考文献15
附录源程序代码16
1引言
利用计算机进行数据处理是计算机应用的一重要领域。
在进行数据处理时,实际需要处理的数据元素一般很多,而这些大量的数据元素都需要存放在计算机中,因此,大量的数据元素按什么结构存放在计算机中,以便提高数据处理的效率,并节省计算机的存储空间,这是进行数据处理的关键问题[1]。
数据结构就是相互之间存在的一种或多种特定关系的数据元素的集合[2]。
本课程设计主要实现矩阵多项式的减法,通过C++语言实现多项式的建立和输出,以及两个多项式相减后的结果输出,其中多项式中的未知量用一个给定矩阵表示。
1.1目的与意义
本课程设计是为了让同学们了解数据结构的作用和意义,学习算法的分析与应用。
设计中主要涉及到线性表的链式存储结构,用线性链表进行数据存储时,每个数据元素用一个结点(node)来存储,一个结点有两个成分域:
一个是存放数据元素的data,称为数据域;另一个是存储指向此链表下一个结点的指针next,称为指针域[3]。
这里主要是运用线性链表实现多项式的存储。
为插入一个新的数据元素,应生成一个新的结点,在需要插入的位置将指针域的指针指向新结点的数据域,将新结点的指针域指向下一结点的数据域。
两个多项式做减法运算,结果按升幂或降幂排列,将要涉及到链表的插入算法。
矩阵结构与程序语言中的二维数组结构很相似,我们可以用数组来表示矩阵,用数组进行运算[4]。
数据结构是计算机科学与技术专业、计算机信息管理与应用专业和电子商务的专业的基础课,是十分重要的课程。
所有的计算机系统软件和应用软件都要用到各种类型的数据结构。
因此,想要更好地运用计算机来解决实际问题,必须学习和掌握好数据结构的有关知识,打好数据结构这门课的扎实基础。
1.2课程设计内容
编写一个程序,用线性链表实现多项式的存储,并完成两个多项式的减法运算,用矩阵表示多项式中的未知量,用具体的多项式调试实现。
第一章引言部分主要介绍了本次课程设计的目的与意义,概述了本次课程设计的主要内容。
第二章开发工具简介,主要是针对开发工具VisualC++6.0的一些简单介绍,包括使用方法等。
第三章主要是对课程设计中涉及的主要函数进行说明,进行数据结构的设计和算法的分析,画出程序流程图。
第四章测试部分简单介绍了测试运行环境和多项式运算介绍,给出具体实例,计算出理论结果,运行程序,得出实际结果并与理论结果相比较,验证程序的可靠性。
2开发工具简介
VisualC++6.0是Microsoft公司在1998年推出的基于Windows9X和WindowsNT的优秀集成开发环境。
该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开发环境轻松地访问C++源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。
VisualC++6.0不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在VisualC++6.0集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作。
VC++6.0是Windows95/98、XP或WindowsNT下的一个应用程序,本身对软硬件没有特殊要求。
就是说它对环境的要求与Windows95/98、WindowsNT要求是一致的。
硬件要求:
一般在586以上的处理器、16MB以上内存、100MB以上的硬盘。
软件要求:
Windows95/98或WindowsNT3.51以上版本。
VC++6.0系统可以在一张CD盘上,也可以在“VisualStudio(VisualC++、VisualFoxpro)”等产品的第一张CD盘上。
一般都有一个VC的自动安装程序,也可以执行VC6目录下的setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。
在安装好VC++6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe安装程序,安装程序会检测当前系统安装VC++6.0的足件,用户单击“添加/删除”按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件。
与一般的应用软件一样,有以下两种启动方式:
(1)通过“开始”按钮,选择“程序”菜单,然后打开“MicrosoftVisualstudio6.0中文版”子菜单中的“MicrosoftVisualC++6.0中文版”程序。
(2)用户也可以使用命令行启动VC。
单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:
\ProgramFiles\MicrosoftVisualStudio\VC98\VC6.exe(按默认盘符和路径安装)即可。
如果要新建一个C++源程序,可采取以下的步骤:
在VisualC++主窗口的主菜单栏中选择文件命令,然后选择新建命令,屏幕上出现一个新建对话框。
单击此对话框的上方的文件,在其下拉菜单中选择“C++SourceFile”项,表示要建立新的C++源程序文件,然后在对话框有半部分的目录文件框中输入准备编辑的源程序文件的存储路径。
在上方的文件文本框中输入准备编辑的源程序文件的名字[5]。
单击确定回到VisualC++主窗口,程序编辑窗口已激活。
在编辑和保存了程序以后,单击主菜单栏中的组建,在其下拉菜单中选择“编译”命令,屏幕上出现一个对话框,提示是否同意建立一个默认的项目工作区,单击“是”按钮,开始编译。
编译通过后,如源程序没有出现错误或警告,则可以进行组建连接,得到.exe可执行文件,单击“执行”命令,程序开始执行。
3设计与实现
3.1函数及说明
矩阵多项式的减法是类似于一元多项式的减法的运算,它将一元多项式中的未知量用一个具体的矩阵进行表示并参与运算。
这里主要采用线性链表的形式实现多项式系数和指数的存储,并用数组表示一个具体的矩阵代替多项式中未知量的输出显示,最终显示出两个矩阵多项式的相减结果。
通过键盘输入一个多项式的项数、系数和指数,调用Create()函数,创建一个多项式,再调用函数Display()函数,对所创建的函数进行输出显示。
创建好亮哥多项式后,主函数将调用Subtration()函数进行两个多项式的减法运算,然后再分别调用Create()函数和Mul()函数对相减后的多项式重新建立一个线性链表存储并做输出最终的相减结果。
程序涉及的主要函数有:
Create()创建一个线性链表,用于存储多项式
Display()输出显示所创建的多项式
Subtration()将两个多项式做减法运算
Mul()完成矩阵的幂运算
3.2数据结构设计
在许多实际应用中,经常会遇到多项式的处理与运算问题。
下面通过运用单链表对多项式的表示以及运算进行讨论。
设多项式为Pn(x)=anxn+an-1xn-1+…+a1x+a0
在采用链表表示多项式时,对于多项式中每一个非零系数的项构成链表中的一个结点,而对于系数为零的项就不用表示。
多项式中非零系数项所构成的结点如图3.1所示。
其中数据域有两项:
exp(i)表示该项的指数值,coef(i)表示该项的系数。
指针域next(i)表示下一个非零系数项的结点序号。
exp(i)
coef(i)
next(i)
图3.1多项式非零系数项的结点结构
另外多项式的未知项用矩阵表示,即二维数组。
在C++中,二维数组中元素排列的顺序是:
按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素[6]。
在本程序中,给定一个具体数组,并进行初始化,完成矩阵的幂运算。
其相关算法如下。
voidMul()
{
inta[2][2]={{2,0},{0,2}};//给定2*2矩阵
intc[2][2];
inti,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
c[i][j]=a[i][j];//初始化矩阵c的值,将矩阵a初值赋给c
for(intl=1;l{
for(i=0;i<2;i++)//矩阵的自乘运算
{
for(j=0;j<2;j++)
{
inttemp=0;
for(k=0;k<2;k++)
temp+=a[i][k]*c[k][j];;
c[i][j]=temp;
}
}
}
}
多项式的相减,主要是多两个多项式中项的指数进行比较,当指数相同时,系数做减运算;当指数不同时,按升幂格式进行排列,被减式的系数前要加负号,其相关算法如下。
if(point1->exp>point2->exp)//被减式指数大于减式
{
p1=point1;
point1=point1->next;
}
elseif(point1->expexp)//被减式的指数小于减式的指数
{
point2->coef=-point2->coef;
p1->next=point2;
p2->next=point2->next;
point2->next=point1;
p1=p1->next;
point1=p1->next;
point2=p2->next;
}
else
{
point1->coef=point1->coef-point2->coef;//指数相同时的减法
}
3.3流程图设计
矩阵多项式的计算主要包括矩阵的相关运算和多项式的运算。
矩阵的运算主要涉及矩阵的幂运算和加减运算,这里主要应用Mul()函数进行矩阵的幂运算。
根据上一小节的相关算法,画出矩阵运算的流程图如图3.1所示。
图3.1矩阵运算的流程图
多项式的计算,申请结点空间,输入多项式的项数、系数和指数,调用创建函数,创建线性链表L3,L4用来存储两个多项式。
用创建的两个多项式做减运算,判断是否有指数相同的两项,若有,则做系数相减,最后将两个多项式相减后的结果放入L3链表中,按升幂顺序排列输出多项式。
程序流程图如图3.2所示。
图3.2流程图
4测试
4.1运行环境
C++语言实验环境配置要求
硬件配置:
586以上PC兼容机或品牌机,配有彩色显示器、鼠标、键盘,内存不小于20MB,硬盘自由空间不小于60MB。
推荐配置为内存32MB或64MB(或以上),硬盘自由空间为500MB以上。
软件配置:
1、操作系统:
Windows98,Windows2000,WindowsXP,Linux,Unix
2、集成开发环境:
(1)在Windows98,Windows2000,WindowsXP系统下,主要的开发编译环境有TurboC/C++3.0、BorlandC++3.1、MicrosoftVisualC++6.0、DJGPP,其中DJGPP是GCC在DOS/Windows操作系统下的移植。
(2)在Linux,Unix系统下,采用GCC编译环境。
本课程设计的测试环境如下:
测试系统:
WindowsXP
测试工具:
VisualC++6.0(中文版)
4.2多项式运算介绍
根据上一章介绍的多项式用链表存储的形式,假设两个多项式f(x)和g(x)已经用链表表示,头指针分别为p1和p2,差多项式用另一个链表表示,头指针为p3。
多项式相减的运算规则很简单,只要从两个多项式链表的第一个元素结点开始检测,对每一次的检测结果做如下运算:
(1)若两个多项式中对应结点的指数值相等,则将它们的系数值相减。
如果不为零,则形成一个新节点后链入头指针为p3的链表末尾。
然后再检测两个链表中的下一个结点。
(2)若两个多项式中对应结点的指数值不相等,则复抄指数值大的那个结点中的指数值与系数值,形成一个新结点后链入头指针为p3的链表末尾。
然后再检测指数值小的链表中的当前结点与指数值大的链表中的下一个结点。
根据上述多项式的链表表示和相减规则,带入实例,分析结果。
已知f(x)=x(3)+x,g(x)=5x(7)+x(3)+7x和
,求f(A)-g(A),即(A(3)+A)-(5A(7)+A(3)+7A)。
根据设计要求,分析程序结果。
f(A)-g(A)=-6
-5
(7)=-
4.3运行结果
执行sub.exe文件,运行程序,进入显示界面如图4.2所示。
图4.2显示界面
根据分析理论结果是用到的具体个例,已知f(x)=x(3)+x,g(x)=5x(7)+x(3)+7x和
,求f(A)-g(A),即(A(3)+A)-(5A(7)+A(3)+7A)。
输入多项式的项数、系数和指数,输出显示多项式,并输出两个多项式的差多项式。
运行结果如图4.3所示。
此结果与理论分析结果一致。
图4.3运行结果图
5结束语
本次课程设计实现了通过键盘输入多项式的系数和指数输出显示一个多项式,并完成了两个多项式相减运算。
用矩阵表示多项式的未知项是通过在程序中给定一个具体矩阵实现,虽然完成矩阵方面的幂运算,但只能实现最终计算结果的输出显示。
友好界面的设计也比较欠缺,还有待改进。
通过本次数据结构的课程设计,我深刻的体会到专业基础知识的重要性,还有自己的不足。
之前在学习C++语言时,由于不是十分认真,掌握、运用并不熟练,对数据结构和算法的理解也不到位。
但是经过本次课程设计,我又重新翻阅了一些相关资料,并加以学习,对相关的知识有了进一步了解,由于个人能力有限,在编程的过程中,查阅了很多相关的算法,最终经个人修改完成。
虽然程序并不完全是自己编写,功能也并不是很到位,但对我而言还是有很大收获。
本次课程设计虽然结束了,但学习还不能停滞不前。
在今后的学习中,应该更注重实践,自己多动手编写程序,只有在实际操作中才能发现问题,并想办法解决问题,才能提高编程能力。
致谢
在本次课程设计完成的过程中,受到了很多人的帮助。
报告的顺利完成,要感谢同学们给予的资料帮助,使我学习到很多知识。
在这里还要感谢何锫老师,他以严谨的教学态度,做研究全力以赴的精神,对我课程设计报告的写作给予悉心指导,提出了许多批评建议,使个人的报告得以如期完成,在此致上最真挚的谢意。
参考文献
[1]徐士良,葛兵.实用数据结构:
C++描述.北京:
清华大学出版社,2006
[2]严蔚敏,吴伟民.数据结构:
C语言版.北京:
清华大学出版社,1997
[3]唐宁九.数据结构与算法分析.成都:
四川大学出版社,2006
[4]廖荣贵,许正宪.数据结构与算法.北京:
清华大学出版社,2004
[5]谭浩强.C++程序设计题解与上机指导.北京:
清华大学出版社,2004
[6]谭浩强.C++程序设计.北京:
清华大学出版社,2004
附录源程序代码
//程序名称:
sub.cpp
//程序功能:
矩阵多项式的减运算
//程序作者:
王沥晨
//最后修改日期:
2010-11-20
#include
usingnamespacestd;
structNode
{
doublecoef;
intexp;
Node*next;
};
Node*Create(int*a,intn)//构造函数
{
intt,l,i,j;
intx[40],y[40];
for(i=0;i<2*n;i++)
{
x[i]=a[2*i];//将系数提出
y[i]=a[2*i+1];//将指数提出
}
for(i=1;i{
t=y[i];
l=x[i];
for(j=i-1;j>=0;j--)
{
if(y[j]>t)
{
y[j+1]=y[j];
x[j+1]=x[j];
}
else
break;
}
y[j+1]=t;
x[j+1]=l;
}
for(i=0;i<2*n;i=i+2)//将输入的序列重新进行排列!
{
j=i/2;//要将两数的数值写出,寻找规律!
a[i]=x[j];
a[i+1]=y[j];
}
Node*head=newNode;
head->next=NULL;
Node*s=head;
for(i=0;i{
Node*r=newNode;
r->coef=a[2*i];//赋值系数
r->exp=a[2*i+1];//赋值指数
s->next=r;
s=r;
}
s->next=NULL;
returnhead;
}
voiddisplay(Node*head)//输出显示多项式
{
inti,j;
intx[2][2]={{2,0},{0,2}};//给定一个2*2矩阵x
inte[2][2]={{1,0},{0,1}};//单位矩阵
Node*p=head->next;
if(p==NULL)//判断链表是否为空
cout<<"0"<else
{
while(p!
=NULL)
{
if(p->exp!
=0)
{
if(p->coef!
=1)
{
cout<coef<<"";
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
cout<}
cout<<"";
}
cout<<"("<exp<<")";
}
else
{
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
cout<}
cout<<"";
}
cout<<"("<exp<<")";
}
}
else
{
cout<coef<<"";
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
cout<}
cout<<"";
}
}
p=p->next;
if(p!
=NULL)
{
if(p->coef>0)
cout<<"+";
else
cout<<"";
}
}
}
}
Node*subtration(Node*xp1,Node*xp2)//多项式减法
{
Node*p1=newNode;
p1=xp1;
Node*head1=xp1;
Node*p2=newNode;
p2=xp2;
Node*point1=p1->next;
Node*point2=p2->next;
while(point1!
=NULL&&point2!
=NULL)
{
if(point1->exp>point2->exp)//被减式指数大于减式
{
p1=point1;
point1=point1->next;
}
elseif(point1->expexp)//被减式的指数小于减式的指数
{
//减式的系数前加负号,并将减式插到被减式的前面
point2->coef=-point2->coef;
p1->next=point2;
p2->next=point2->next;
point2->next=point1;
p1=p1->next;
point1=p1->next;
point2=p2->next;
}
else
{
point1->coef=point1->coef-point2->coef;//指数相同时的减法!
if(point1->coef==0)
{
p1->next=point1->next;
deletepoint1;
point1=p1->next;
}
else
{
p1=point1;
point1=point1->next;
}
p2->next=point2->next;
deletepoint2;
point2=p2->next;
}
}
Node*p3=point2;//记录跳出来时L2的所在!
以便后来L1能把链子挂上!
if(point2!
=NULL)//将第二条链子说剩下的按负数输出!
!
{
while(point2!
=NULL)
{
point2->coef=-point2->coef;
p2=point2;
point2=point2->next;
}
p1->next=p3;
}
deletexp2;
returnhead1;
}
voidMul(Node*head)
{
inta[2][2]={{2,0},{0,2}};
intc[2][2];
intb[2][2];
inti,j,k;
intexp,coef;
Node*p=head->next;
p->exp=exp;
p->coef=coef;
if(p==NULL)//判断链表是否为空
cout<<"0"<else
{
while(p!
=NULL)
{
if(p->exp!