多项式的简单运算数据结构课程设计.docx
《多项式的简单运算数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《多项式的简单运算数据结构课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
多项式的简单运算数据结构课程设计
一、课程设计目的《数据结构》是计算机专业的专业基础课,是一门实践性很强的课程,学生通过理论学习,并在完成每章后面的一些小程序后,理解了数据结构的基本概念,掌握了一些基本的编程技术,但仅有这一方面的训练还是很不够的。
全面、严格的训练,是学好该课程的一个不可缺少的组成部分。
课程设计对于提高学生用学到的书本知识解决实际问题,培养实际工作所需要的动手能力,对于提高以科学理论和工程上的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用。
通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计要求《数据结构课程设计》则要培养、训练学生选用合适的数据结构并运用程序设计语言(C/C++)编写质量高的应用程序。
并建立初步评价算法程序的能力。
为编译技术、操作系统、数据库及算法设计与分析等后继课程的学习以及为应用软件特别是非数值应用软件的开发打下良好的理论基础和实践基础重点和难点:
1.针对具体问题如何选择或设计合适的数据结构;
2.如何根据一定的存储策略实现数据的存储表示;
3.基于上述数据结构设计并实现完成具体要求的算法;
4.对算法的时间性能进行分析。
针对每一个设计题目写出
1.问题分析和任务定义:
根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?
(而不是怎么做?
)限制条件是什么?
2.逻辑设计:
对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。
逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;
3.详细设计:
定义相应的存储结构并写出各函数的伪码算法。
在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。
详细设计的结果是对数据结构和基本操作作出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;
4.程序编码:
把详细设计的结果进一步求精为程序设计语言程序。
同时加入一些注解和断言,使程序中逻辑概念清楚;
5.程序调试与测试:
采用自底向上,分模块进行,即先调试低层函数。
能够熟练掌握调试工具的各种功能,设计
测试数据确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;
三、题目是“用C语言实现一元多项式的相加相减和相乘”
1.问题分析和任务定义:
用单链表的结构来存储多项式的信息是合适的。
首先,一元多项式是必须在运行时动态决定创建的,单链表的动态分配内存空间能够很好的解决这个问题,从而避免了空间上浪费。
其次,对于多项式的运算是以其每个节点为单位进行的,其排列可以根据多项式各个项式的指数的不同,由高到低排列,其中对于指数相同的项进行系数的归并,是加减法的运算基础。
2.逻辑设计:
一元多项式的每个项都有2个重要数据域,一是系数二是指数,由于考虑到用链表的存储结构故而还要设计下一个节点的指针域,从而节点的结构体就这样形成了。
在创建链表时,为了便于对新开辟的节点进行赋值,所以在内存中开辟float系数,int指数
的暂存单元,它们连续从终端接受数据,并且覆盖上一次的数据,从而保证了输入的连续性。
链表在创建过程中以什么作为结束链表的创建的标志?
这很重要,考虑到系数为0,该节点
就没有意义,故而链表结束创建的标志是00,这样的节点会在插入的过程中自动删除。
3.详细设计:
定义节点
typedefstructnode//定义节点类型
{
floatcoef;
intexpn;
structnode*next;
}PLOY;
创建链表
voidinsert(PLOY*head,PLOY*inpt);
PLOY*creat(charch);//charch中的ch则是多项式的字符标志,如f,g等,传入字符后,接下来就为其函数内的暂存单元赋数值,接着将创建的节点,调用insert函数,将节点插入链
表,继而返回链表的头指针
输出链表
voidprint(PLOY*fun)//此函数是根据实际的输出格式,对链表的信息进行加工后输出,由于考虑到如果系数为正,直接输出就会缺少‘+'号,而如果该系数为正且系链表的第一项就省
略,另外就是,如果系数的绝对值为1,就可以省略系数1,直接输出符号链表的加操作
PLOY*addPLOY(PLOY*head,PLOY*pre)//多项式相加,此原理就是将其中的一条链表的各个项,都用一个结构体单元拷贝后,调用insert函数直接插入另外一条链表,从而返回该链表
链表的减操作
PLOY*minusPLOY(PLOY*head,PLOY*pre)//多项式相减,原理与加法相似,但是由于设计到‘—'号,在拷贝每个结构体单元后必须,在系数上加‘—'链表的乘操作
PLOY*byPLOY(PLOY*head1,PLOY*head2)//多项式相乘,先从其中一个链表的第一项开始,依次去乘以另一个链表的每一项,并开辟新链表,插入每一项,直到全部乘完
4.程序编码:
#include
usingnamespacestd;
typedefstructnode//定义节点类型{
floatcoef;
intexpn;
structnode*next;
}PLOY;
voidstart()//用户选择界面
{cout<<"\t\t====================================="<"<cout<<"\t\t====================================="<"<cout<<"\t\t0.退出"<cout<<"\t\t1.两个一元多项式相加"<cout<<"\t\t3.两个一元多项式相减"<}
voidinsert(PLOY*head,PLOY*inpt)//参数1:
链表的头节点,参数2:
待插入的节点
{
PLOY*pre,*now;
intsignal=0;
pre=head;//pre指向头节点
if(pre->next==NULL){pre->next=inpt;}//如果只有头结点,就将待插入的节点,接上
else{
now=pre->next;//否则将now指针指向第一个节点
while(signal==0)
指数小,往后插
下一个节点没有
{
if(inpt->expnexpn)//
{
if(now->next==NULL)//
{
now->next=inpt;
signal=1;
}
else
{pre=now;
now=pre->next;
如果发现比现在的链节大了就插入到这个连接的前
elseif(inpt->expn>now->expn)//面
{
inpt->next=now;pre->next=inpt;signal=1;
}
else
{
now->coef=now->coef+inpt->coef;//系数相加signal=1;
deleteinpt;//释放插入节点if(now->coef==0)//系数等于0{
pre->next=now->next;//删除该节点
deletenow;
}
}
PLOY*creat(charch)//创建链表
{
PLOY*head,*inpt;
floatx;
inty;//系数及指数的暂存单元
head=newPLOY;//创建链表头head->next=NULL;//初始化链表
)"<cout<<"请输入一元多项式"<(格式是:
系数指数;以00结束!
cin>>x>>y;//给暂存单元赋值
while(x!
=0)
{
inpt=newPLOY;inpt->coef=x;inpt->expn=y;
inpt->next=NULL;//以暂存单元的数值来创建一个节点
insert(head,inpt);//将该节点插入链表中
cout<<"请输入一元多项式"<(以00结束!
)"<>x>>y;//给下一个节点的暂存单元赋值
}
returnhead;
}
PLOY*addPLOY(PLOY*head,PLOY*pre)//{
PLOY*inpt;
intflag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当指向空时跳出循环else
{
pre=pre->next;
inpt=newPLOY;//创建新链节inpt->coef=pre->coef;inpt->expn=pre->expn;inpt->next=NULL;insert(head,inpt);
}//把当前"g(x)"的节点插入到"y(x)"中}
returnhead;
}
PLOY*minusPLOY(PLOY*head,PLOY*pre)//{
PLOY*inpt;
intflag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当指向空时跳出循环
else
{
pre=pre->next;
多项式相加
多项式相减
inpt=newPLOY;//创建新链节inpt->coef=-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否则把当前"g(x)"的节点插入到"y(x)"中}
returnhead;
}
//多项式相乘
PLOY*byPLOY(PLOY*head1,PLOY*head2){
PLOY*inpt,*res,*pre;
intflag=0;
res=newPLOY;
res->next=NULL;//初始化存放结果的链表
head1=head1->next;
pre=head2;
while(flag==0)
{
if(pre->next==NULL)
{
pre=head2;//当现在指向空时跳出循环head1=head1->next;
continue;
}
if(head1==NULL)
{
flag=1;//当现在指向空时跳出循环continue;
}
pre=pre->next;
inpt=newPLOY;//创建新链节inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);//把当前"g(x)"的链节插入到"y(x)"中}returnres;
}voidprint(PLOY*fun)//输出多项式
{
PLOY*printing;//打印指针
intflag=0;//打印完成的标志
printing=fun->next;//给打印指针初始化,从第1个节点开始
if(fun->next==NULL)
{
cout<<"0"<return;
}
//如果该链表为空,则输出0while(flag==0)
{
if(printing->coef>0&&fun->next!
=printing)//如果打印项不是第1项,且系数大于0
printf("+");//先打印"+"号,因为正数不带"+"号
if(printing->coef!
=1&&printing->coef!
=-1)//系数非1或-1的普通情况
{
printf("%f",printing->coef);
if(printing->expn==1)
printf("X");
else
if(printing->expn!
=0)
printf("XA%d",printing->expn);
else//系数为1或者-1的情况
{
if(printing->coef==1)
{
if(!
printing->expn)printf("1");
elseif(printing->expn==1)printf("X");
else
printf("XA%d",printing->expn);
}
if(printing->coef==-1)
{
if(!
printing->expn)printf("-1");elseif(printing->expn==1)printf("-X");elseprintf("-XA%d",printing->expn);
}
}
if(printing->next==NULL)flag=1;
else
printing=printing->next;
}
cout<}voidmain()
{
PLOY*f,*g;
intsign=-1;//设置标志
start();
cout<<"\n输入你想要的操作代码:
"while(sign!
=0)
{
cin>>sign;
switch(sign)
{
case0:
break;//退出
case1:
{
:
"<cout<<"\n你选择的操作是多项式相加f=creat('f');//输入多项式f(x)cout<<"f(x)=";
print(f);
g=creat('g');//输入多项式g(x)
cout<<"g(x)=";
print(g);
cout<<"F(x)=f(x)+g(x)=";f=addPLOY(f,g);//两个多项式相加print(f);
sign=-1;//复位标志
start();//回复用户选择界面break;
}
case2:
{
cout<<"你选择的操作是多项式相乘f=creat('f');//输入多项式f(x)cout<<"f(x)=";
print(f);
g=creat('g');//输入多项式g(x)cout<<"g(x)=";
print(g);
cout<<"F(x)=f(x)*g(x)=";f=byPLOY(f,g);//两个多项式相乘print(f);
sign=-1;//复位标志
start();//回复用户选择界面break;
}
case3:
{
cout<<"你选择的操作是多项式相减f=creat('f');//输入多项式f(x)cout<<"f(x)=";
print(f);
g=creat('g');//输入多项式g(x)cout<<"g(x)=";
:
"<:
"<print(g);
cout«"F(x)=f(x)-g(x)二";
f=minusPLOY(f,g);〃两个多项式相减
print(f);
sign=-1;〃复位标志
start();〃回复用户选择界面
break;
}
default:
{
cout<<"输入有误!
请重新选择操作!
"<start();
break;
}
}
}
}
5.程序调试与测试:
拠-1-——兀京卫肉式的相力14K柏谟.柏乘土
~H:
\Liehuq空宫林羊bh:
—亓*EhJexe"
扌年探■!
*=K_退出■*-i-w-r—.h-TO-T9-WT-.
P俞入唯尔扭.歪白勺择作-代弔马=N
#夢煲岂鬆蠡錚瑁翌蹩.孰数寸旨冰=1^,»«结束!
仙镣入一兀秦顶心的T—项乂以“«结馬!
>
忌矗入一亍亡割顼心白勺下一顼=2-U«结康!
P
|T<:
-c>—1-ldtJie,tit,0Hr-总.tJtJidiJtitjK亠-1
萨镜入一尢自工页:
^乂榕式畀・疾吉攵扌以❷a结耒!
a皆缶入一尹;宰珈竝的卜一换=€咲8a结車!
>
kf*T4fi?
..A_—“”,宰丄页:
代口的卜一一两="乂片0紿审!
>
na
Lcm^—4_<-5t_ciRPinnfixA4
fee»>二:
f<«>*H<^c>—k_nnnem^KA4
两亍开哥工页#的相如”相嫌才口年
瞿婀髀眇
&吉籀人一兀毎项式£
a35,
呼输入一元參顼戎£的下一项乂叹00纪東!
>
请辐入一元參工页式£的下一顼y以0结束!
>
M0
tcse^^Gifi-RRfl»HRXAA*23-ARRF)RR>E^"5
诒输入一k多项式rr=u檢式足.毎数扌抒敕;1?
Ab0结束!
〉
bbh
晴输人一元辜H页尹暫旳下一丄页Y以厲«負^束!
>
揺诲入一元务项式n的下一顶江以90结束!
A
冃0
fr-5.n»dnf}dM^&E.HRR»RnX-6
lr-f-2B(9.0«UtdHUK-^71*115.UU«U00KVC3n^A36.B00UU0K^12112BU-
一两不二完芸議菽鬲祐乔;藕蠢厂需55厂
请选擇探■(仁❺唾萸__■、:
L_两丁一匹垒;一—..—审个一匹秦藝总:
芫垂豔癮
3”两个一兀峯顼式
两彳-一亓狷」页式的相力U”相减,相汞=
一一目目
J-1-1_连以„HHH_-"一吩凳壬操一军更人—“i-J-LJ-H磴曲两两一^0iW3_
四、总结
程序=算法+数据结构;通过本次的C++数据结构的实习,使我对于这句话的理解更加深刻,
数据结构就像是建立一个数学模型,将现实世界的各种事物及现实问题抽象出来,并加以表示,使计算机能够按照人类的意愿,进行运算。
而只有模型建立得合适,才能够简化计算。
从而设计出高效,稳定的好程序。
以上便是我对此次实习的最大理解。
五、参考文献:
[1]王红梅,胡明,王涛编著.数据结构(C++版).北京.清华大学出版社,2007
[2]王晓东编著.数据结构.北京.科学出版社,2002
[3]郑莉等编著.C++程序设计教程.北京机械工业出版社,2001