多项式的简单运算数据结构课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、课程设计目的
《数据结构》是计算机专业的专业基础课,是一门实践性很强的课程,学生通过理论学习,并在完成每章后面的一些小程序后,理解了数据结构的基本概念,掌握了一些基本的编程技术,但仅有这一方面的训练还是很不够的。

全面、严格的训练,是学好该课程的一个不可缺少的组成部分。

课程设计对于提高学生用学到的书本知识解决实际问题,培养实际工作所需要的动手能力,对于提高以科学理论和工程上的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用。

通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

二、课程设计要求
《数据结构课程设计》则要培养、训练学生选用合适的数据结构并运用程序设计语言(C/C++)编写质量高的应用程序。

并建立初步评价算法程序的能力。

为编译技术、操作系统、数据库及算法设计与分析等后继课程的学习以及为应用软件特别是非数值应用软件的开发打下良好的理论
基础和实践基础
重点和难点:
1. 针对具体问题如何选择或设计合适的数据结构;
2. 如何根据一定的存储策略实现数据的存储表示;
3. 基于上述数据结构设计并实现完成具体要求的算法;
4. 对算法的时间性能进行分析。

针对每一个设计题目写出
1. 问题分析和任务定义:
根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?
2. 逻辑设计:
对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。

逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;
3. 详细设计:
定义相应的存储结构并写出各函数的伪码算法。

在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。

详细设计的结果是对数据结构和基本操作作出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;
4. 程序编码:
把详细设计的结果进一步求精为程序设计语言程序。

同时加入一些注解和断言,使程序中逻辑概念清楚;
5. 程序调试与测试:
采用自底向上,分模块进行,即先调试低层函数。

能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。

调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;
三、题目是“用C语言实现一元多项式的相加相减和相乘”
1. 问题分析和任务定义:
用单链表的结构来存储多项式的信息是合适的。

首先,一元多项式是必须在运行时动态决定创建的,单链表的动态分配内存空间能够很好的解决这个问题,从而避免了空间上浪费。

其次,对于多项式的运算是以其每个节点为单位进行的,其排列可以根据多项式各个项式的指数的不同,由高到低排列,其中对于指数相同的项进行系数的归并,是加减法的运算基础。

2.逻辑设计:
一元多项式的每个项都有2个重要数据域,一是系数二是指数 ,由于考虑到用链表的存储结构故而还要设计下一个节点的指针域 ,从而节点的结构体就这样形成了。

在创建链表时,为了便于对新开辟的节点进行赋值,所以在内存中开辟float 系数,int 指数的暂存单元,它们连续从终端接受数据,并且覆盖上一次的数据,从而保证了输入的连续性。

链表在创建过程中以什么作为结束链表的创建的标志?这很重要,考虑到系数为0 ,该节点就没有意义,故而链表结束创建的标志是 0 0,这样的节点会在插入的过程中自动删除。

3.详细设计:
定义节点
typedef struct node //定义节点类型
{
float coef;
int expn;
struct node * next;
}PLOY;
创建链表
void insert(PLOY *head,PLOY *inpt);
PLOY *creat(char ch); //char ch 中的ch 则是多项式的字符标志,如f,g等,传入字符后,接下来就为其函数内的暂存单元赋数值,接着将创建的节点,调用insert 函数,将节点插入链表,继而返回链表的头指针
输出链表
void print(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<iostream>
using namespace std;
typedef struct node //定义节点类型
{
float coef;
int expn;
struct node * next;
}PLOY;
void start() //用户选择界面
{
cout<<"\t\t====================================="<<endl;
cout<<"\t\t 两个一元多项式的相加/相减,相乘:"<<endl;
cout<<"\t\t====================================="<<endl;
cout<<"\t\t请选择操作:"<<endl;
cout<<"\t\t0.退出"<<endl;
cout<<"\t\t1.两个一元多项式相加"<<endl;
cout<<"\t\t2.两个一元多项式相乘"<<endl;
cout<<"\t\t3.两个一元多项式相减"<<endl;
cout<<"\t\t====================================="<<endl;
}
void insert(PLOY *head,PLOY *inpt) //参数1:链表的头节点,参数2:待插入的节点
{
PLOY *pre,*now;
int signal=0;
pre=head;//pre指向头节点
if(pre->next==NULL) {pre->next=inpt;} //如果只有头结点,就将待插入的节点,接上 else {
now=pre->next; //否则将now 指针指向第一个节点
while(signal==0)
{
if(inpt->expn<now->expn)//指数小,往后插
{
if(now->next==NULL) //下一个节点没有
{
now->next=inpt;
signal=1;
}
else
{
pre=now;
now=pre->next;
}
}
else if(inpt->expn>now->expn)//如果发现比现在的链节大了就插入到这个连接的前面
{
inpt->next=now;
pre->next=inpt;
signal=1;
}
else
{
now->coef=now->coef+inpt->coef; //系数相加
signal=1;
delete inpt;//释放插入节点
if(now->coef==0) //系数等于0
{
pre->next=now->next; //删除该节点
delete now;
}
}
}
}
}
PLOY *creat(char ch) //创建链表
{
PLOY *head,*inpt;
float x;
int y; //系数及指数的暂存单元
head=new PLOY; //创建链表头
head->next=NULL; //初始化链表
cout<<"请输入一元多项式"<<ch<<":(格式是:系数指数;以0 0 结束!)"<<endl; cin>>x>>y; //给暂存单元赋值
while(x!=0)
{
inpt=new PLOY;
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL; //以暂存单元的数值来创建一个节点
insert(head,inpt);//将该节点插入链表中
cout<<"请输入一元多项式"<<ch<<"的下一项:(以0 0 结束!)"<<endl;
cin>>x>>y; //给下一个节点的暂存单元赋值
}
return head;
}
PLOY *addPLOY(PLOY *head,PLOY *pre)//多项式相加{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当指向空时跳出循环
else
{
pre=pre->next;
inpt=new PLOY;//创建新链节
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//把当前"g(x)"的节点插入到"y(x)"中
}
return head;
}
PLOY *minusPLOY(PLOY *head,PLOY *pre)//多项式相减{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当指向空时跳出循环
else
{
pre=pre->next;
inpt=new PLOY;//创建新链节
inpt->coef=-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否则把当前"g(x)"的节点插入到"y(x)"中
}
return head;
}
PLOY *byPLOY(PLOY *head1,PLOY *head2) //多项式相乘{
PLOY *inpt,*res,*pre;
int flag=0;
res=new PLOY;
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=new PLOY;//创建新链节
inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);//把当前"g(x)"的链节插入到"y(x)"中
}
return res;
}
void print(PLOY *fun)//输出多项式
{
PLOY *printing; //打印指针
int flag=0; //打印完成的标志
printing=fun->next;//给打印指针初始化,从第1个节点开始
if(fun->next==NULL)
{
cout<<"0"<<endl;
return ;
}
//如果该链表为空,则输出0
while (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("X^%d",printing->expn);
}
else //系数为1或者-1的情况
{
if(printing->coef==1)
{
if(!printing->expn)
printf("1");
else
if(printing->expn==1)
printf("X");
else
printf("X^%d",printing->expn);
}
if(printing->coef==-1)
{
if(!printing->expn)
printf("-1");
else
if(printing->expn==1)
printf("-X");
else
printf("-X^%d",printing->expn);
}
}
if(printing->next==NULL)
flag=1;
else
printing=printing->next;
}
cout<<endl;
}
void main()
{
PLOY *f,*g;
int sign=-1;//设置标志
start();
cout<<"\n输入你想要的操作代码:" ;
while(sign!=0)
{
cin>>sign;
switch(sign)
{
case 0:
break;//退出
case 1:
{
cout<<"\n你选择的操作是多项式相加:"<<endl; 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;
}
case 2:
{
cout<<"你选择的操作是多项式相乘:"<<endl; 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;
}
case 3:
{
cout<<"你选择的操作是多项式相减:"<<endl; 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<<"输入有误!请重新选择操作!"<<endl;//选择错误,返回选择界面start();
break;
}
}
}
}
5.程序调试与测试:
四、总结
程序=算法+数据结构;通过本次的C++数据结构的实习,使我对于这句话的理解更加深刻,数据结构就像是建立一个数学模型,将现实世界的各种事物及现实问题抽象出来,并加以表示,使计算机能够按照人类的意愿,进行运算。

而只有模型建立得合适,才能够简化计算。

从而设计出高效,稳定的好程序。

以上便是我对此次实习的最大理解。

五、参考文献:
[1] 王红梅,胡明,王涛编著.数据结构(C++版).北京.清华大学出版社,2007
[2] 王晓东编著.数据结构.北京.科学出版社,2002
[3] 郑莉等编著.C++程序设计教程.北京机械工业出版社,2001
等。

相关文档
最新文档