当前位置:文档之家› 一元稀疏多项式计算器(数据结构)

一元稀疏多项式计算器(数据结构)

院系:计算机科学学院专业:软件工程年级: 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后指}if (A==NULL&&B==NULL) //如果A B 都为空p->next=NULL;return head; //返回头指针}(3)其他函数(同组的成员设计)#include <iostream>#include <process.h>using namespace std;typedef struct node{float coef; //系数int exp; //指数struct node *next; //指针域指向下一个系数不为0的子项} PolyNode;PolyNode *Input() //输入函数{float c; //系数域int e; //指数域PolyNode *p,*q,*r,*head;cout<<"请输入多项式:\n";cout<<"形式:系数1 指数1 系数2 指数2 系数3 指数3......0 0:\n";head=new PolyNode; //建立头接点p=head;p->next=NULL;for (;;){cin>>c>>e;if(c==0&&e==0) break; //结束输入if(c==0) continue; //从新输入,不保存if(head->next==NULL) //输入第一个接点{p->next=new PolyNode;p=p->next;p->coef=c,p->exp=e;p->next=NULL;continue;}p=head;while(p->next!=NULL && e<=p->next->exp) p=p->next; //如果输入的指数小于p的下一个接点,p向后指if (e==p->exp) {p->coef+=c;continue;} //如果相等,直接加上去,继续循环q=new PolyNode;q->coef=c,q->exp=e;if (p->next!=NULL&&e>p->next->exp) //如果p的后继接点的指数小于输入的指数,插入到p的当前接点之后{r=p->next;p->next=q;q->next=r;continue;}p->next=q; //如果输入的值小于所有接点,接在最后一个接点之后p=p->next; p->next=NULL;}return head;}输出函数void Output(PolyNode*head) //输出{PolyNode*p;p=head->next;if(p==NULL) {cout<<"当前没有公式或计算结果为0,请选1输入!!!\n"; return;}if(p!=NULL){cout<<"计算结果:\n";cout<<p->coef<<"X~"<<p->exp;p=p->next;}while(p!=NULL){cout<<"+"<<p->coef<<"X~"<<p->exp;p=p->next;}cout<<endl;cout<<"如果想重新输入公式,请选1输入!!!\n\n";}四、调试分析与操作说明(1)当程序运行时,进入主界面。

相关主题