一元稀疏多项式计算器(数据结构)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
院系:计算机科学学院
专业:软件工程
年级: 2013级
课程名称:数据结构
姓名:韦宜(201321092034)指导教师:***
2015年 12 月 15日
题目:设计一个一元稀疏多项式简单计算器
班级:软件工程1301 姓名:韦宜学号:201321092034 完成日期:12月15日
一、需求分析
问题描述:设计一个一元多项式加法器
基本要求:
输入并建立多项式;
(2)两个多项式相加;
(3)输出多项式:n, c1, e1, c2, e2, …cn , en, 其中,n是多项式项数,ci和ei分别是第i 项的系数和指数,序列按指数降序排列。
(4)计算多项式在x处的值;
(5)求多项式的导函数。
软件环境:Windows,UNIX,Linux等不同平台下的Visual C++ 6.0
硬件环境: 512MB内存,80Gb硬盘,Pentium4 CPU,CRT显示器。
二、概要分析
本程序有五个函数:
PolyNode *Input()(输入函数);
PolyNode *Deri(PolyNode *head)(求导函数);
PolyNode * Plus(PolyNode *A,PolyNode *B)(求和函数);
void Output(PolyNode*head)(输出函数);
int main()(主函数)
本程序可使用带有附加头结点的单链表来实现多项式的链表表示,每个链表结点表示多项式的一项,命名为node,它包括两个数据成员:系数coef和指数exp,他们都是公共数据成员,*next为指针域,用链表来表示多项式。适用于不定的多项式,特别是对于项数再运算过程中动态增长的多项式,不存在存储溢出的问题。其次,对于某些零系数项,在执行加法运算后不再是零系数项,这就需要在结果多项式中增添新的项;对于某些非零系数项,在执行加法运算后可能是零系数项,这就需要在结果多项式中删去这些项,利用链表操作,可以简单的修改结点的指针以完成这种插入和删除运算(不像在顺序方式中那样,可能移动大量数据项)运行效率高。
三、详细设计
(1)主函数:
int main()
{
PolyNode *head_a,*head_b;
int choice;
head_a=new PolyNode;head_a->next=NULL;
do
{
system("cls");//清屏函数
Output(head_a);
cout<<" ______________________________\n";
cout<<"|---------1.输入公式-----------|\n";
cout<<"|---------2.求导-----------|\n";
cout<<"|---------3.两式求和-----------|\n";
cout<<"|---------4.退出程序-----------|\n";
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
cin>>choice;
if (choice==1) head_a=Input();
else if (choice==2) head_a=Deri(head_a); //求导
else if (choice==3) {head_b=Input();head_a=Plus(head_a,head_b);}//求和
else if (choice==4) break;
else cout<<"输入错误,重新输入:\n";
}
while(choice!=5);
return 0;
(2)由于此程序是二人合作完成,我在此程序中主要是完成求和和求导函数的设计。所以下面着重介绍下求和函数和求导函数。
PolyNode *Deri(PolyNode *head)(求导函数):
流程图如下:
求导函数部分代码:
PolyNode *Deri(PolyNode *head) //求导
{
PolyNode *p=head;
while (p->next!=NULL)
{
if(p->next->exp==0) p->next=NULL; //指数为零返回
else
{
p->next->coef*=p->next->exp; //系数乘以指数
p->next->exp--; //指数减一
p=p->next;
}
}
return head;
用于对输入的多项式进行求导,求导在链表内进行计算,即运算完成链表的值改变,返回头指针。
PolyNode * Plus(PolyNode *A,PolyNode *B)(求和函数):
流程图如下:
本函数用于对多项式进行加法计算,需要运用存有两个多项式的头指针,前一头指针可是前一计算的计算结果,也可是调用输入函数,后一头指针是调用输入函数输入的多项式的头接点。经过计算得到一个新的链表,函数返回链表的头指针。
求和函数部分代码
PolyNode * Plus(PolyNode *A,PolyNode *B)//相加
{
PolyNode *head,*p;
head=new PolyNode;
p=head;
A=A->next;
B=B->next;
while(A!=NULL||B!=NULL)
{
if(A==NULL) {p->next=B; break;} //如果A空,把B后面的所有接点接到p之后
if(B==NULL) {p->next=A; break;} //如果B空,把A后面的所有接点接到p之后
if(A->exp==B->exp) //如果两指数数相等,相加
{
if(A->coef+B->coef!=0)
{p->next=new PolyNode;
p=p->next;
p->exp=A->exp;
p->coef=A->coef+B->coef;
}
A=A->next;
B=B->next; continue; //如果两系数互为倒数,不保存,后指,继续循环
}
if(A->exp > B->exp) //A的指数大于B的指数
{
p->next=new PolyNode;
p=p->next;
p->exp=A->exp;
p->coef=A->coef;
A=A->next; continue; //将A的当前接点接到新链表后面,A后指}
p->next=new PolyNode;
p=p->next;
p->exp=B->exp;
p->coef=B->coef;
B=B->next; //将B的当前接点接到新链表后面,B后指