一元多项式地加法减法乘法地实现
- 格式:doc
- 大小:497.50 KB
- 文档页数:28
中国计量学院实验报告实验课程:算法与数据结构实验名称:一元二项式班级:学号:姓名:实验日期: 2013-5-7一.实验题目:①创建2个一元多项式②实现2个多项式相加③实现2个多项式相减④实现2个多项式相乘⑤实现2个多项式相除⑥销毁一元多项式实验成绩:指导教师:二.算法说明①存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。
②加法算法三.测试结果四.分析与探讨实验数据正确,部分代码过于赘余,可以精简。
五.附录:源代码#include<>#include<>#include<>typedef struct Polynomial {float coef;int expn;struct Polynomial *next;}*Polyn,Polynomial;出多项式a和b\n\t2.多项式相加a+b\n\t3.多项式相减a-b\n");printf("\t4.多项式相除a*b\n\t5.多项式相除a/b\n\t6.销毁多项式\n");printf("\t7.退出\n*********************************** ***********\n");printf("执行:");scanf("%d",&flag);switch(flag){case(1):printf("多项式a:");PrintPolyn(pa); printf("多项式b:");PrintPolyn(pb);break;case(2):pc=AddPolyn(pa,pb);printf("多项式a+b:");PrintPolyn(pc);DestroyPolyn(pc);break;case(3):pd=SubtractPolyn(pa,pb);printf("多项式a-b:");PrintPolyn(pd);DestroyPolyn(pd);break;case(4):pf=MultiplyPolyn(pa,pb);printf("多项式a*b:");PrintPolyn(pf); DestroyPolyn(pf);break;case(5):DevicePolyn(pa,pb);break;case(6):DestroyPolyn(pa);DestroyPolyn(pb);printf("成功销毁2个一元二项式\n");printf("\n接下来要执行的操作:\n1 重新创建2个一元二项式 \n2 退出程序\n");printf("执行:");scanf("%d",&i);if(i==1){// Polyn pa=0,pb=0,pc,pd,pf;//定义各式的头指针,pa与pb在使用前付初值NULLprintf("请输入a的项数:");scanf("%d",&m);pa=CreatePolyn(pa,m);//建立多项式aprintf("请输入b的项数:");scanf("%d",&n);pb=CreatePolyn(pb,n);//建立多项式bbreak;}if(i==2)return 0; case(7): return 0;} } } }。
一、设计题目一元多项式的加法、减法、乘法的实现。
二、主要内容设有一元多项式A m(x)和B n(x).A m(x)=A0+A1x1+A2x2+A3x3+… +A m x mB n(x)=B0+B1x1+B2x2+B3x3+… +B n x n请实现求M(x)= A m(x)+B n(x)、M(x)= A m(x)-B n(x)和M(x)= A m(x)×B n(x)。
要求:1) 首先判定多项式是否稀疏2) 采用动态存储结构实现;3) 结果M(x)中无重复阶项和无零系数项;4) 要求输出结果的升幂和降幂两种排列情况三、具体要求及应提交的材料1.每个同学以自己的学号和姓名建一个文件夹,如:“312009*********张三”。
里面应包括:学生按照课程设计的具体要求所开发的所有源程序(应该放到一个文件夹中)、任务书和课程设计说明书的电子文档。
2.打印的课程设计说明书(注意:在封面后夹入打印的“任务书”以后再装订)。
四、主要技术路线提示为把多个小功能结合成一个完整的小软件,需使用“菜单设计”技术(可以是控制台方式下的命令行形式,若能做成图形方式则更好)。
五、进度安排共计两周时间,建议进度安排如下:选题,应该在上机实验之前完成需求分析、概要设计可分配4学时完成详细设计可分配4学时调试和分析可分配10学时。
2学时的机动,可用于答辩及按教师要求修改课程设计说明书。
注:只用课内上机时间一般不能完成设计任务,所以需要学生自行安排时间做补充。
六、推荐参考资料(不少于3篇)[1]苏仕华等编著,数据结构课程设计,机械工业出版社,2007[2]严蔚敏等编著,数据结构(C语言版),清华大学出版社,2003[3]严蔚敏等编著,数据结构题集(C语言版),清华大学出版社,2003指导教师签名日期年月日系主任审核日期年月日摘要分析了matlab,mathmatic,maple等数学软件对一元多项式的计算过程,步骤后。
由于这些软件比较大功能齐全,但是实用性不强。
c语言一元多项式的加法,减法,乘法的实现一元多项式是代数学中的重要概念,它由各项式的系数和幂次构成。
在C语言中,我们可以通过定义结构体来表示一元多项式,并实现加法、减法和乘法运算。
我们定义一个结构体来表示一元多项式。
结构体中包含两个成员变量,一个是整数类型的系数coeff,另一个是整数类型的幂次exp。
```ctypedef struct{int coeff; // 系数int exp; // 幂次} Polynomial;```接下来,我们可以实现一元多项式的加法运算。
加法运算的规则是将两个多项式中幂次相同的项的系数相加,若幂次不同的项,则直接将其添加到结果多项式中。
具体实现如下:```cPolynomial addPolynomial(Polynomial poly1, Polynomial poly2){Polynomial result;result.coeff = poly1.coeff + poly2.coeff;result.exp = poly1.exp;return result;}```然后,我们可以实现一元多项式的减法运算。
减法运算的规则是将被减多项式的各项的系数取相反数,然后再与减数多项式相加。
具体实现如下:```cPolynomial subtractPolynomial(Polynomial poly1, Polynomial poly2){Polynomial result;result.coeff = poly1.coeff - poly2.coeff;result.exp = poly1.exp;return result;}```我们可以实现一元多项式的乘法运算。
乘法运算的规则是将两个多项式的每一项相乘,然后将结果相加。
具体实现如下:```cPolynomial multiplyPolynomial(Polynomial poly1, Polynomialpoly2){Polynomial result;result.coeff = poly1.coeff * poly2.coeff;result.exp = poly1.exp + poly2.exp;return result;}```通过上述的实现,我们可以对一元多项式进行加法、减法和乘法运算。
C++开放项目实验报告题目:一元符号多项式四则运算姓名:指导老师:学号:班级:一、内容总结1.功能要求用所学C++知识编程实现两个一元符号多项式的加法,减法和乘法运算。
2.算法概要设计①结点插入函数void Insert (PNode *temp);②多项式的创建函数void CreatPoly();③赋值运算符的重载Polynomail& operator = (const Polynomail &p1);④一元符号多项式的加法Polynomail& operator + (const Polynomail &p);⑤一元符号多项式的减法Polynomail& operator - (Polynomail &p);⑥一元符号多项式的乘法Polynomail& operator * (const Polynomail &p);3.应用技巧①利用Insert()插入函数规范多项式的输入问题,进行同类项的合并和不同类项间的排序问题,使得到有序的链表,方便后续的运算②对赋值、加、减和乘运算符进行重载,赋予其新的意义,进行多项式间的四则运算。
③发现函数间联系,可以减少代码的长度。
巧妙利用Insert()函数和加运算符重载函数,方便乘法和减法等代码编写。
二、实验成果1.输入要求按提示一次输入多项式各项的系数和指数,建立多项式。
如下所示: 系数,指数:1,2系数,指数:3,4系数,指数:0 4(以输入系数为零的项结束创建)创建结果为:1x^2+3x^4进行加法运算2根据自己的需要选择输入功能序号进行运算,如选择数字2.输出样例总体上各项是按照输入的方法进行输出,如果指数为零只输出系数,如果系数为零,那么该项不输出,如果系数为负数,那么两项间“+”变“-”。
以上述输入为例创建的结果为:1x^2+3x^4。
如果另一个多项式为:-1-2x^6,那么加法运算后的结果为:-1+1x^2+3x^4-2x^6:主要代码展示 3.//**** c++开放实验项目****//一元符号多项式的四则运算#include <iostream>using namespace std;struct PNode{PNode(double c=0,int e=-1){ coef=c; expn=e; next=NULL;}double coef;int expn;PNode *next;};class Polynomial{public:Polynomial(){poly=new PNode;}Polynomial(Polynomial &p);void Print();~Polynomial();void Insert (PNode *temp);void CreatPoly();Polynomial& operator = (const Polynomial &p);Polynomial& operator + (const Polynomial &p);Polynomial& operator - (Polynomial &p);Polynomial& operator * (const Polynomial &p);private:PNode *poly;};//析构函数Polynomial::~Polynomial(){PNode *pt=poly->next;while (pt){poly->next=pt->next;delete pt;pt=poly->next;}delete poly;poly=NULL;}//赋值运算符的重载Polynomial& Polynomial::operator = (const Polynomial &p){ this->~Polynomial();poly=new PNode;PNode *pt=poly,*qt=p.poly->next;while(qt){PNode *s=new PNode(qt->coef,qt->expn);pt->next=s;pt=s;qt=qt->next;}return *this;}//复制构造函数Polynomial::Polynomial(Polynomial &p){poly=new PNode;*this=p;}//遍历void Polynomial::Print(){if(poly->next==NULL){cout<<empty!\n;return;}PNode *pt=poly->next;if(pt){if(pt->expn==0){cout<<pt->coef;}else {潣瑵?瑰?潣晥?硜属?瑰?硥湰※}pt=pt->next;}while (pt){if(pt->expn==0){cout<<pt->coef;}else {if(pt->coef<0){潣瑵?瑰?潣晥?硜属?瑰?硥湰※}else {潣瑵???瀼?挾敯?尼幸?瀼?放灸?}}pt=pt->next;}cout<<endl;}//结点插入函数void Polynomial::Insert (PNode *temp){ if(poly->next==NULL){poly->next=temp;return;}PNode *pt=poly;PNode *qt=pt->next;while(qt&&qt->expn<temp->expn){ pt=qt;qt=pt->next;}if(qt==NULL||qt->expn>temp->expn){ temp->next=qt;pt->next=temp;}else {qt->coef+=temp->coef;if(qt->coef==0){pt->next=qt->next;delete qt;}}}//多项式的构建函数void Polynomial::CreatPoly(){double c;int e;潣瑵?系数,指数:;cin>>c>>e;while (c){PNode *p=new PNode(c,e);Insert(p);潣瑵?系数,指数:;cin>>c>>e;}}//多项式的加法Polynomial& Polynomial::operator + (const Polynomial &q){ Polynomial *PC=new Polynomial;PNode *ta=poly->next,*tb=q.poly->next, *tc=PC->poly; while(ta&&tb){int a=ta->expn;int b=tb->expn;int t=a>b?1:(b>a?-1:0);switch(t){case -1:{PNode *s=new PNode(ta->coef,ta->expn);tc->next=s;tc=s;ta=ta->next;break;}case 0:{double sum=ta->coef+tb->coef;if(sum==0){ta=ta->next;tb=tb->next;}else {PNode *s=new PNode(sum,ta->expn);tc->next=s;tc=s;ta=ta->next;tb=tb->next;}break;}case 1:{PNode *s=new PNode(tb->coef,tb->expn);tc->next=s;tc=tc->next;tb=tb->next;break;}} //switch} //whilewhile (ta){PNode *s=new PNode(ta->coef,ta->expn);tc->next=s;tc=s;ta=ta->next;}while (tb){PNode *s=new PNode(tb->coef,tb->expn);tc->next=s;tc=s;tb=tb->next;}return *PC;}//多项式的减法Polynomial& Polynomial::operator - (Polynomial &p){//复制取反相加Polynomial P(p),*PC=new Polynomial;PNode *pt=P.poly->next;while(pt){pt->coef=-pt->coef;pt=pt->next;}*PC=*this+P;return *PC;}//多项式的乘法Polynomial& Polynomial:: operator * (const Polynomial &p){ Polynomial *PC=new Polynomial;PNode *pt=poly->next,*qt;for(;pt;pt=pt->next){for(qt=p.poly->next;qt;qt=qt->next){PNode *s=new PNode(pt->coef*qt->coef,pt->expn+qt->expn);PC->Insert(s);}}return *PC;}//主函数int main(){Polynomial PA,PB,PC;int index;cout<< //------一元符号多项式的表示及运算------// <<endl;潣瑵?本函数的功能列表:<<endl;cout<<.多项式的加法:<<endl;cout<<.多项式的减法:<<endl;cout<<.多项式的乘法:<<endl;cout<<.选择重建多项式:<<endl;cout<<_x0005_.结束运算\n<<endl;潣瑵?依次输入PA各项系数和指数(以输入系数0项结束),建立多项式:<<endl;PA.CreatPoly();PA.Print();潣瑵?依次输入PB各项系数和指数(以输入系数0项结束),建立多项式:<<endl;PB.CreatPoly();PB.Print();cout<<\请输入功能序号进行多项式的运算:;cin>>index;while(index){switch(index){case 1:{PC=PA+PB;cout<<PC=PA+PB:;PC.Print();break;}case 2:{PC=PA-PB;cout<<PC=PA-PB:;PC.Print();break;}case 3:{PC=PA*PB;cout<<PC=PA*PB:;PC.Print();break;}case 4:{int flag;潣瑵?输入0修改多项式PA,其他数字保留多项式PA:;cin>>flag;if(!flag){PA.CreatPoly();PA.Print();}潣瑵?输入0修改多项式PB,其他数字保留多项式PB:;cin>>flag;if(!flag){PB.CreatPoly();PB.Print();}break;}case 5:{潣瑵?运算结束<<endl;return 0;}}//switchcout<<\是否需要继续,请再次输入选择:;cin>>index;}//whilereturn 0;}4.项目结果展示实践体会三、在此次的C++开放项目试验中,我承担了用C++实现一元符号多项式的四则运算,将所学C++知识运用实战编程中去,并及时进行知识的查缺补漏,帮助我更好的掌握了C++这门语言。
简单的一元多项式计算器程序简单的一元多项式计算器程序是一款用于求解一元多项式的数学工具。
该程序能够接收用户输入的多项式表达式,并根据用户的需求进行加法、减法、乘法、除法等基本运算,以及求导、积分等高级运算。
下面是该计算器程序的标准格式文本:一、程序介绍该一元多项式计算器程序是基于Python语言开发的,旨在提供一个简单易用的工具,帮助用户进行一元多项式的计算。
通过该程序,用户可以快速进行多项式的基本运算和高级运算,提高计算效率。
二、功能特点1. 支持一元多项式的输入:用户可以输入多项式表达式,例如2x^2 + 3x + 1,程序能够识别并进行计算。
2. 支持基本运算:程序支持一元多项式的加法、减法、乘法和除法运算,用户可以根据需要选择相应的运算。
3. 支持高级运算:程序还提供了求导、积分等高级运算功能,用户可以根据需要进行相关计算。
4. 提供友好的交互界面:程序提供了简洁、直观的用户界面,用户可以轻松输入多项式表达式,并查看计算结果。
5. 提供详细的计算过程:程序在计算过程中,会详细展示每一步的计算过程,让用户清晰了解计算的步骤和结果。
三、使用方法1. 输入多项式表达式:用户可以在程序界面中输入一元多项式的表达式,例如2x^2 + 3x + 1。
2. 选择运算类型:用户可以选择需要进行的运算类型,包括加法、减法、乘法、除法、求导和积分。
3. 查看计算结果:程序会根据用户的选择进行计算,并将计算结果显示在程序界面中。
四、示例演示假设用户输入了多项式表达式2x^2 + 3x + 1,并选择进行求导运算。
程序会按照如下步骤进行计算:1. 计算多项式的一阶导数:- 对2x^2求导,得到4x^1=4x;- 对3x求导,得到3;- 对1求导,得到0;2. 将各项导数相加,得到4x + 3。
五、注意事项1. 输入格式正确性:用户在输入多项式表达式时,请确保格式正确,例如每一项之间用"+"或"-"连接,指数使用"^"符号表示。
⼀元多项式加法、减法、乘法实现源代码////链接程序:#include#include#include//using namespace std;#define N 1000//#define INF 65535void link();void shunxu();void Menu();typedef struct{int a[N];//记录多项式int len;//记录多项式的长度}Ploy;typedef struct //项的表⽰{ float coef; //系数int expn; //指数}term;typedef struct LNode{ term data; //term多项式值struct LNode *next;}LNode,*LinkList; //两个类型名typedef LinkList polynomail; //⽤带头结点的有序链表表⽰多项式/*⽐较指数*/int cmp(term a,term b){ if(a.expn>b.expn) return 1;if(a.expn==b.expn) return 0;if(a.expnelse exit(-2);}/*⼜⼩到⼤排列*/void arrange1(polynomail pa){ polynomail h=pa,p,q,r;if(pa==NULL) exit(-2);for(p=pa;p->next!=NULL;p=p->next); r=p;for(h=pa;h->next!=r;)//⼤的沉底{ for(p=h;p->next!=r&&p!=r;p=p->next)if(cmp(p->next->data,p->next->next->data)==1){ q=p->next->next;p->next->next=q->next;q->next=p->next;p->next=q;}r=p;//r指向参与⽐较的最后⼀个,不断向前移动} }/*由⼤到⼩排序*/void arrange2(polynomail pa){ polynomail h=pa,p,q,r;if(pa==NULL) exit(-2);for(p=pa;p->next!=NULL;p=p->next); r=p;for(h=pa;h->next!=r;)//⼩的沉底{ for(p=h;p->next!=r&&p!=r;p=p->next)if(cmp(p->next->next->data,p->next->data)==1){ q=p->next->next;p->next->next=q->next;q->next=p->next;p->next=q;}r=p;//r指向参与⽐较的最后⼀个,不断向前移动} }/*打印多项式,求项数*/int printpolyn(polynomail P){ int i;polynomail q;if(P==NULL) printf("⽆项!\n");else if(P->next==NULL) printf("Y=0\n");else{ printf("该多项式为Y=");q=P->next;i=1;if(q->data.coef!=0&&q->data.expn!=0){ printf("%.2fX^%d",q->data.coef,q->data.expn); i++; }if(q->data.expn==0&&q->data.coef!=0)printf("%.2f",q->data.coef);//打印第⼀项q=q->next;if(q==NULL){printf("\n");return 1;}while(1)//while中,打印剩下项中系数⾮零的项,{ if(q->data.coef!=0&&q->data.expn!=0){ if(q->data.coef>0) printf("+");printf("%.2fX^%d",q->data.coef,q->data.expn); i++;}if(q->data.expn==0&&q->data.coef!=0){ if(q->data.coef>0) printf("+");printf("%f",q->data.coef);}q=q->next;if(q==NULL){ printf("\n"); break; }}}return 1;}/*1、创建并初始化多项式链表*/polynomail creatpolyn(polynomail P,int m){//输⼊m项的系数和指数,建⽴表⽰⼀元多项式的有序链表P polynomail r,q,p,s,Q;int i;P=(LNode*)malloc(sizeof(LNode));r=P;for(i=0;i{s=(LNode*)malloc(sizeof(LNode));printf("请输⼊第%d项的系数和指数:",i+1);scanf("%f%d",&s->data.coef,&s->data.expn);r->next=s;r=s;}r->next=NULL;if(P->next->next!=NULL){for(q=P->next;q!=NULL/*&&q->next!=NULL*/;q=q->next)//合并同类项for(p=q->next,r=q;p!=NULL;)if(q->data.expn==p->data.expn){q->data.coef=q->data.coef+p->data.coef;r->next=p->next;Q=p;p=p->next;free(Q);}else{r=r->next;p=p->next;}}return P;}/*2、两多项式相加*/polynomail addpolyn(polynomail pa,polynomail pb) {//完成多项式相加运算,即:Pa=Pa+Pb polynomail s,newp,q,p,r;int j;p=pa->next;q=pb->next;newp=(LNode*)malloc(sizeof(LNode));r=newp;while(p&&q)//p&&q都不为空{s=(LNode*)malloc(sizeof(LNode));switch(cmp(p->data,q->data)){case -1: s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s;r=s;p=p->next;break;case 0: s->data.coef=p->data.coef+q->data.coef;if(s->data.coef!=0.0){s->data.expn=p->data.expn;r->next=s;r=s;}p=p->next;q=q->next;break;case 1: s->data.coef=q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;break;}//switch}//while p||q有⼀个跑完就跳出该循环while(p)//p没跑完{s=(LNode*)malloc(sizeof(LNode));s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s;r=s;p=p->next;}//p跑完跳出循环while(q)//q没跑完{s=(LNode*)malloc(sizeof(LNode));s->data.coef=q->data.coef;s->data.expn=q->data.expn;r=s;q=q->next;}//q跑完跳出循环//p&&q都跑完r->next=NULL;for(q=newp->next;q->next!=NULL;q=q->next)//合并同类项{for(p=q;p!=NULL&&p->next!=NULL;p=p->next)if(q->data.expn==p->next->data.expn){q->data.coef=q->data.coef+p->next->data.coef;r=p->next;p->next=p->next->next;free(r);}}printf("升序 1 , 降序 2\n");printf("选择排序⽅式:");scanf("%d",&j);if(j==1)arrange1(newp);elsearrange2(newp);return newp;}/*3、两多项式相减*/polynomail subpolyn(polynomail pa,polynomail pb){//完成多项式相减运算,即:Pa=Pa-Pbpolynomail s,newp,q,p,r,Q; int j;p=pa->next;q=pb->next;newp=(LNode*)malloc(sizeof(LNode));r=newp;while(p&&q){s=(LNode*)malloc(sizeof(LNode));switch(cmp(p->data,q->data)){case -1: s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s;r=s;p=p->next;break;case 0: s->data.coef=p->data.coef-q->data.coef;if(s->data.coef!=0.0){s->data.expn=p->data.expn;r->next=s;r=s;}p=p->next;q=q->next;break;case 1: s->data.coef=-q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;}//switch}//whilewhile(p){s=(LNode*)malloc(sizeof(LNode));s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s;r=s;p=p->next;}while(q){s=(LNode*)malloc(sizeof(LNode));s->data.coef=-q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;}r->next=NULL;if(newp->next!=NULL&&newp->next->next!=NULL)//合并同类项{for(q=newp->next;q!=NULL;q=q->next)for(p=q->next,r=q;p!=NULL;)if(q->data.expn==p->data.expn){q->data.coef=q->data.coef+p->data.coef;r->next=p->next;Q=p;p=p->next;free(Q);}else{r=r->next;p=p->next;}}printf("升序 1 , 降序 2\n");printf("选择:");scanf("%d",&j);if(j==1)arrange1(newp);elsearrange2(newp);return newp;}/*4两多项式相乘*/polynomail mulpolyn(polynomail pa,polynomail pb){//完成多项式相乘运算,即:Pa=Pa*Pbpolynomail s,newp,q,p,r;int i=20,j;newp=(LNode*)malloc(sizeof(LNode));r=newp;for(p=pa->next;p!=NULL;p=p->next)for(q=pb->next;q!=NULL;q=q->next){s=(LNode*)malloc(sizeof(LNode));s->data.coef=p->data.coef*q->data.coef;s->data.expn=p->data.expn+q->data.expn;r->next=s;r=s;}r->next=NULL;printf("升序 1 , 降序 2\n");printf("选择:");scanf("%d",&j);if(j==1)arrange1(newp);elsearrange2(newp);for(;i!=0;i--){for(q=newp->next;q->next!=NULL;q=q->next)//合并同类项for(p=q;p!=NULL&&p->next!=NULL;p=p->next)if(q->data.expn==p->next->data.expn){q->data.coef=q->data.coef+p->next->data.coef;r=p->next;p->next=p->next->next;free(r);}}return newp;}/*5、销毁已建⽴的两个多项式*/void delpolyn(polynomail pa,polynomail pb){polynomail p,q;p=pa;while(p!=NULL){q=p;p=p->next;free(q);}p=pb;while(p!=NULL){q=p;p=p->next;free(q);}printf("两个多项式已经销毁\n");}void Menulink(){printf("\n");printf(" ********⼀元多项式链式存储的基本运算********\n"); printf(" 1、创建两个⼀元多项式请按1\n");printf(" 2、两多项式相加得⼀新多项式请按2\n");printf(" 3、两多项式相减得⼀新多项式请按3\n");printf(" 4、两多项式相乘得⼀新多项式请按4\n");printf(" 5、销毁已建⽴的两个多项式请按5\n");printf(" 6、退出该⼦系统返回主菜单请按6\n");printf(" 7、退出该系统请按7\n");printf(" ********************************************\n");printf("\n");}void link() //⼀元多项式链式存储的实现{polynomail pa=NULL,pb=NULL;polynomail p,q;polynomail addp=NULL,subp=NULL,mulp=NULL; int n,m;printf("已进⼊链式存储⼀元多项式运算的⼦系统\n"); Menulink();while(1){printf("请选择你想进⾏的链式存储运算操作:\n"); scanf("%d",&n);switch(n){case 1:if(pa!=NULL){printf("已建⽴两个⼀元多项式,请选择其他操作!"); break;}printf("请输⼊第⼀个多项式:\n");printf("要输⼊⼏项:");scanf("%d",&m);while(m==0){printf("m不能为0,请重新输⼊m:");scanf("%d",&m);}pa=creatpolyn(pa,m);printpolyn(pa);printf("请输⼊第⼆个多项式:\n");printf("要输⼊⼏项:");scanf("%d",&m);while(m==0){printf("m不能为0,请重新输⼊m:");scanf("%d",&m);}pb=creatpolyn(pb,m);printpolyn(pb);break;case 2:if(pa==NULL){printf("请先创建两个⼀元多项式!\n");break;}addp=addpolyn(pa,pb);printpolyn(addp);break;case 3:if(pa==NULL){printf("请先创建两个⼀元多项式!\n");break;}subp=subpolyn(pa,pb);printpolyn(subp);break;case 4:if(pa==NULL){printf("请先创建两个⼀元多项式!\n"); break;}mulp=mulpolyn(pa,pb);printpolyn(mulp);break;case 5:if(pa==NULL){printf("请先创建两个⼀元多项式!\n"); break;}delpolyn(pa,pb);pa=pb=NULL;printf("两个⼀元多项式的销毁成功!\n"); break;case 6:if(addp!=NULL){p=addp;while(p!=NULL){q=p;p=p->next;free(q);}}if(subp!=NULL){p=subp;while(p!=NULL){q=p;p=p->next;free(q);}}printf("返回主菜单\n");Menu();break;case 7:if(addp!=NULL){p=addp;while(p!=NULL){q=p;p=p->next;free(q);}}if(subp!=NULL){p=subp;while(p!=NULL){q=p;p=p->next;free(q);}}printf("已成功退出该系统,谢谢你的使⽤!\n");exit(-2);break;}//switch}//while}//2、顺序程序:void ADD(Ploy A,Ploy B,Ploy *M)/*多项式A与多项式B相加,得到多项式M*/{int la=A.len,lb=B.len,i;M->len=la>lb?la:lb;for(i=0;i<=la&&i<=lb;i++){M->a[i]=A.a[i]+B.a[i];}while(i<=la){M->a[i]=A.a[i];i++;}while(i<=lb){M->a[i]=B.a[i];i++;}return;}void SUB(Ploy A,Ploy B,Ploy *M)/*多项式A与多项式B相减(A-B),得到多项式M*/{int la=A.len,lb=B.len,i;M->len=la>lb?la:lb;for(i=0;i<=la&&i<=lb;i++){M->a[i]=A.a[i]-B.a[i];}while(i<=la) {M->a[i]=A.a[i];i++;}while(i<=lb) {M->a[i]=0-B.a[i];i++;}return ;}void MUL(Ploy A,Ploy B,Ploy *M)/*多项式A与多项式B相乘,得到多项式M*/{int i,j;for(i=0;i<=A.len+B.len+1;i++) M->a[i]=0;for(i=0;i<=A.len;i++)for(j=0;j<=B.len;j++){M->a[i+j]+=A.a[i]*B.a[j];}M->len=A.len+B.len;return ;}void GetPloy(Ploy *A){int i,coef,ex,maxe=0;//ex指指数,maxe指最⼤指数char ch;printf("请输⼊每个项的系数及对应的指数,指数为负数时标志输⼊结束!\n");for(i=0;iA->a[i]=0;scanf("%d%d",&coef,&ex);while(ex>=0){if(ex>maxe)maxe=ex;if(A->a[ex]!=0){printf("你输⼊的项已经存在,是否更新原数据?(Y/N)"); cin>>ch;if(ch=='Y'||ch=='y'){A->a[ex]=coef;printf("更新成功,请继续输⼊!\n");}elseprintf("请继续输⼊!\n");;}elseA->a[ex]=coef;scanf("%d%d",&coef,&ex);}A->len=maxe;return ;}void PrintPloy1(Ploy A)//降序输出顺序⼀元多项式{int i;printf(" %dx^%d ",A.a[A.len],A.len);for(i=A.len-1;i>=1;i--){if(A.a[i]==0) ;else if(A.a[i]==1) printf(" + x^%d ",i);else if(A.a[i]==-1) printf(" - x^%d ",i);else{if(A.a[i]>0)printf("+ %dx^%d ",A.a[i],i);elseprintf("- %dx^%d ",-A.a[i],i);}}if(A.a[0]==0) ;else if(A.a[0]>0)printf(" + %d",A.a[0]);//打印x的0次项elseprintf(" - %d",-A.a[0]);printf("\n");return ;}void PrintPloy2(Ploy A)//升序输出顺序⼀元多项式{int i=0;while(A.a[i]==0)++i;if(i==0)printf("%d",A.a[i]);else{if(A.a[i]==1)printf("x^%d",i);else if(A.a[i]==-1)printf("-x^%d",i);elseprintf("%dx^%d",A.a[i],i);}for(++i;i<=A.len;i++){if(A.a[i]==0) ;else if(A.a[i]==1)printf(" + x^%d",i);else if(A.a[i]==-1)printf(" - x^%d",i);else if(A.a[i]>1)printf(" + %dx^%d",A.a[i],i);else if(A.a[i]<-1)printf(" - %dx^%d",-A.a[i],i);}}void Menushunxu(){printf("\n");printf(" ********⼀元多项式顺序存储的基本运算********\n");printf(" 1、更新两个多项式⼀元多项式请按1\n");printf(" 2、两多项式相加得⼀新多项式请按2\n");printf("3、两多项式相减得⼀新多项式请按3\n");printf(" 4、两多项式相乘得⼀新多项式请按4\n");printf(" 5、退出该⼦系统,返回主菜单请按5\n");printf(" 6、退出该系统请按6\n");printf(" ********************************************\n");printf("\n");return ;}void shunxu() //⼀元多项式顺序存储的实现{Ploy A,B,M;int n,m;printf("进⼊顺序存储⼀元多项式运算⼦系统\n");printf("请输⼊多项式A:\n");GetPloy(&A);printf("请输⼊多项式B:\n");GetPloy(&B);printf("输出两个⼀元多项式A、B,降幂输出请按1,升幂输出请按2!\n"); cin>>m;while(m<1&&m>m){printf("你输⼊的输出新创⼀元多项式的操作号不合法,请重新输⼊\n"); cin>>m;}switch(m){case 1:if(m==1){printf("A降=");PrintPloy1(A);printf("\n");printf("B降=");PrintPloy1(B);break;case 2:if(m==2){printf("A升=");PrintPloy1(A);printf("\n");printf("B升=");PrintPloy1(B);}break;}Menushunxu();while(1){printf("请选择你想进⾏的顺序存储运算操作:\n");cin>>n;while(n<1&&n>6){printf("输⼊的顺序操作号不对,请重新输⼊\n");cin>>n;}switch(n){case 1:if(n==1)printf("更新两个多项式:\n");printf("请输⼊多项式A:\n");GetPloy(&A);printf("请输⼊多项式B:\n");GetPloy(&B);printf("输出两个更新的⼀元多项式A、B,降幂输出请按1,升幂输出请按2!\n"); cin>>m;while(m<1&&m>2){printf("你输⼊的输出排序操作号不合法,请重新输⼊\n");cin>>m;}switch(m){case 1:if(m==1){printf("A降=");PrintPloy1(A);printf("\n");printf("B降=");PrintPloy1(B);}break;case 2:if(m==2){printf("A升=");PrintPloy1(A);printf("\n");printf("B升=");PrintPloy1(B);}break;break;case 2:if(n==2)ADD(A,B,&M);printf("降幂输出请按1,升幂输出请按2!\n");cin>>m;while(m<1&&m>2){printf("你输⼊的输出排序操作号不合法,请重新输⼊\n"); cin>>m;}switch(m){case 1:if(m==1){printf("ADD降=");PrintPloy1(M);printf("\n");}break;case 2:if(m==2){printf("ADD升=");PrintPloy2(M);printf("\n");}break;}break;case 3:if(n==3)SUB(A,B,&M);printf("降幂输出请按1,升幂输出请2!\n");cin>>m;while(m<1&&m>2){printf("你输⼊的输出排序操作号不合法,请重新输⼊\n"); cin>>m;}switch(m){case 1:if(m==1){printf("SUB降=");PrintPloy1(M);printf("\n");}break;case 2:if(m==2){printf("SUB升=");PrintPloy2(M);printf("\n");}break;}break;case 4:if(n==4)MUL(A,B,&M);printf("降幂输出请按1,升幂输出请2!\n");cin>>m;while(m<1&&m>3){printf("你输⼊输出排序操作号不合法,请重新输⼊\n"); cin>>m;}switch(m){case 1:if(m==1){printf("MUL降=");PrintPloy1(M);printf("\n");}break;case 2:if(m==2){printf("MUL升=");PrintPloy2(M);printf("\n");}break;}break;case 5:if(n==5)printf("返回主菜单\n");Menu();break;case 6:if(n==6)printf("已成功退出该系统,谢谢你的使⽤!\n");exit(-2);break;}}}void Menu(){printf("\n");printf(" ************⼀元多项式的基本运算系统************\n"); printf(" 1、⼀元多项式顺序存储的⼦系统请按1\n");printf(" 2、⼀元多项式链式存储的基本运算请按2\n"); printf(" 3、退出系统请按3\n");printf(" ************************************************\n"); printf("\n");printf("请输⼊你想进⾏的操作号:\n");int n;scanf("%d",&n);while(n!=1 && n!=2 && n!=3){printf("对不起,你的输⼊不正确,请重新输⼊!\n"); scanf("%d",&n);}switch(n){case 1:if(n==1)shunxu();break;case 2:if(n==2)link();break;case 3:if(n==3)printf("已成功退出该系统,谢谢你的使⽤!\n"); exit(-2);}}void main(){Menu();}。
c语言数据结构实现——一元多项式的基本运算在C语言中,一元多项式的表示与运算是常见的数据结构操作之一。
一元多项式由一系列具有相同变量的单项式组成,每个单项式由系数和指数组成。
本文将介绍如何使用C语言实现一元多项式的基本运算,包括多项式的创建、求和、差、乘积等操作。
首先,我们需要定义一个结构体来表示单项式。
每个单项式由一个系数和一个指数组成,我们可以将其定义如下:```cstruct term{float coefficient; // 系数int exponent; // 指数};typedef struct term Term;```接下来,我们可以定义一个结构体来表示一元多项式。
一元多项式由一系列单项式组成,可以使用一个动态数组来存储这些单项式。
```cstruct polynomial{Term* terms; // 单项式数组int num_terms; // 单项式数量};typedef struct polynomial Polynomial;```现在,我们可以开始实现一元多项式的基本运算了。
1. 创建一元多项式要创建一元多项式,我们需要输入每个单项式的系数和指数。
我们可以使用动态内存分配来创建一个适应输入的单项式数组。
```cPolynomial create_polynomial(){Polynomial poly;printf("请输入多项式的项数:");scanf("%d", &poly.num_terms);poly.terms = (Term*)malloc(poly.num_terms * sizeof(Term));for(int i = 0; i < poly.num_terms; i++){printf("请输入第%d个单项式的系数和指数:", i+1);scanf("%f %d", &poly.terms[i].coefficient, &poly.terms[i].exponent);}return poly;}```2. 求两个一元多项式的和两个一元多项式的和等于对应指数相同的单项式系数相加的结果。
问题描述:在数学上,一个一元n次多项式样(兀)可按降序写成:P…(X)= P”X〃+ P w_1x w-,+...+p]x+p0它是由n+1个系数唯一确定。
因此,在计算机里它可以用一个线性表P来表示:一元多项式的运算包括加法、减法和乘法,而多项式的减法和乘法都可以用加法来实现。
设Pn(x)和Qm(x)分别为两个一元多项式。
试编写程序实现一元多项式的加法运算。
一、需求分析1、本程序要求用基于线性表的基本操作来实现一元多项式的加法运算,并且需要利用有序链表来实现线性表2、输入输出的的形式:输入输入多项式的项数:4 //表示第一个多项式的项数输入多项式的各项(系数在前幕次在后):9, 15 (回车)//表示9x157, 8 (回车)5, 3 (回车)3, 1 (回车)输岀(按降無输出)输入的多项式是:+9x 15+ 7x 8+5x 3+3x 1输入多项式的项数:3 //表示第二个多项式的项数输入多项式的各项(系数在前幕次在后):6, 3 (回车)-7, 8 (回车)2, 0 (回车)输出输入的多项式是:-7x 8+ 6x 3+2x 0他们求和后的多项式是:9x15+11x3+3x1+ 2x03、输入值得范围:项数为短整型,每一项的系数和幕次为double类型,不对非法输入进行处理,即假定所有的输入都是合法的4、测试数据:输入多项式的项数5输入多项式的各项(系数在前幕次在后)9 158 9-7 65 43 2输入的多项式是+9x 15+8x 9~7x 6+5x 4+3x 2输入多项式的项数4输入多项式的各项(系数在前幕次在后)712897 62 1输入的多项式是+7x12+8x9+7x6+2x1他们求和后的多项式是+9x^15+7x 12+16x 9+5x 4+3x 2+2x 1二、概要设计1、抽象数据类型:为实现以上功能,根据题目要求,采用单链表来存储多项式,并声明一个节点类Node,其公有数据类型为两个int 型变量用来保存多项式每一项的系数和無次,以及一个next指针用以指向多项式的下一项。
福建农林大学计算机与信息学院课程设计报告课程名称:数据结构课程设计题目:一元多项式的加法减法乘法的实现姓名:系:软件工程系专业:软件工程专业年级:2014学号:指导教师:黄思先职称:副教授完成起止日期:2016.6.5 - 2016.7.12016年07月1日福建农林大学计算机与信息学院课程设计结果评定目录一、问题分析和任务定义 (1)二、程序设计内容 (1)三、程序调试与测试 (7)四、实验心得 (9)五、程序编码 (9)一、问题分析及任务定义顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。
【问题描述和基本要求】设有一元多项式Am(x)和Bn(x).Am(x)=A0+A1x1+A2x2+A3x3+…+AmxmBn(x)=B0+B1x1+B2x2+B3x3+…+Bnxn请实现求M(x)= Am(x)+Bn(x)、M(x)= Am(x)-Bn(x)和M(x)= Am(x)×Bn(x)。
要求:1) 首先判定多项式是否稀疏2) 分别采用顺序和动态存储结构实现;3) 结果M(x)中无重复阶项和无零系数项;4) 要求输出结果的升幂和降幂两种排列情况二、课程设计的内容2.1函数多项式创建函数PolyNode *Creatpoly()多项式输出函数void Prin_poly(PolyNode *h)多项式升序排列函数void Insortup(PolyNode *h)多项式降序排列函数void Insortdown(PolyNode *h)多项式合并函数void UnitePoly(PolyNode *h)多项式相乘函数PolyNode *polymuti(PolyNode *h1,PolyNode *h2)多项式相加函数PolyNode *addition(PolyNode *ha, PolyNode *hb)多项式相减函数PolyNode *subduction (PolyNode *ha, PolyNode *hb) 2.2设计各个模块的流程图(1)main()(2) void Insortup(PolyNode *h)Y(3)void Insortdown(PolyNode *h)Y(4) PolyNode *polymuti(PolyNode *h1,PolyNode *h2)(5)void UnitePoly(PolyNode *h)(6) PolyNode *addition(PolyNode *ha, PolyNode *hb)三、程序调试与测试相加结果相减结果相乘结果四、实验心得在本次课程设计中,我明白了理论应与实际相结合,上机练习是提高编程能力最有效的办法,这次实验提高了我编写大型程序的能力以及查阅资料并从中获得有效资料的能力。
这次课程设计加深了我对数据结构的进一步理解。
五、程序编码实验程序:#include<stdio.h>#include <stdlib.h>#include <conio.h>typedef struct Node{int coef;//系数int exp;//指数struct Node *next;}PolyNode;PolyNode *Creatpoly()//创建多项式的单链表{PolyNode *h,*p,*q;h=(PolyNode *)malloc(sizeof(PolyNode));p=h;p->next=NULL;printf("请输入多项式的系数及其指数a b,当系数输入0时停止输入\n");q=(PolyNode *)malloc(sizeof(PolyNode));scanf("%d %d",&q->coef,&q->exp);while(q->coef!=0){p->next=q;p=q;q=(PolyNode *)malloc(sizeof(PolyNode));scanf("%d %d",&q->coef,&q->exp);}p->next=NULL;return(h);}void Prin_poly(PolyNode *h)//将多项式输出函数{PolyNode *p;p=h->next;while(p!=NULL){if(p->coef>0&&p!=h->next){if(p->exp>0)printf("+%dx^%d",p->coef,p->exp);else if(p->exp<0)printf("+%dx^(%d)",p->coef,p->exp);elseprintf("+%d",p->coef);}else if(p->coef<0&&p!=h->next){if(p->exp>0)printf("%dx^%d",p->coef,p->exp);else if(p->exp<0)printf("%dx^(%d)",p->coef,p->exp);elseprintf("%d",p->coef);}else{if(p->exp>0)printf("%dx^%d",p->coef,p->exp);else if(p->exp<0)printf("%dx^(%d)",p->coef,p->exp);else printf("%d",p->coef);}p=p->next;}}void Insortup(PolyNode *h)//排序函数,使多项式中的各项按X的升幂排列{PolyNode *s,*p;int t,m;for(p=h->next;p!=NULL;p=p->next)//类似于冒泡排序{for(s=h->next;s->next!=NULL;s=s->next){if(s->exp>s->next->exp){t=s->exp;m=s->coef;s->coef=s->next->coef;s->exp=s->next->exp;s->next->coef=m;s->next->exp=t;}}}}void Insortdown(PolyNode *h)//排序函数,使多项式中的各项按X的降幂排列{PolyNode *s,*p;int t,m;for(p=h->next;p!=NULL;p=p->next)//类似于冒泡排序{for(s=h->next;s->next!=NULL;s=s->next){if(s->exp<s->next->exp){t=s->exp;m=s->coef;s->coef=s->next->coef;s->exp=s->next->exp;s->next->coef=m;s->next->exp=t;}}}}void UnitePoly(PolyNode *h)//合并同类项{PolyNode *p1,*p2,*q1,*q2,*temp;q1=h;p1=q1->next;while(p1!=NULL){p2=p1->next;q2=p1;while(p2!=NULL){if(p1->exp==p2->exp){p1->coef=p1->coef+p2->coef;if(p1->coef==0){temp=p2;q2->next=p2->next;free(temp);temp=p1;q1->next=p1->next;p1=q1;free(temp);break;}else{temp=p2;q2->next=p2->next;p2=p2->next;free(temp);}}else{q2=p2;p2=p2->next;}}q1=p1;p1=p1->next;}}PolyNode *polymuti(PolyNode *h1,PolyNode *h2)//多项式相乘{PolyNode *h,*p,*p1,*p2,*q;p1=h1->next;h=p=(PolyNode *)malloc(sizeof(PolyNode));p->next=NULL;while(p1){p2=h2->next;while(p2){q=(PolyNode *)malloc(sizeof(PolyNode));q->coef=p1->coef*p2->coef;q->exp=p1->exp+p2->exp;p->next=q;p=q;p2=p2->next;}p1=p1->next;}p->next=NULL;return(h);}PolyNode *addition(PolyNode *ha, PolyNode *hb)//一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式ha中,并将多项式hb删除{PolyNode *p,*q,*pre,*temp;int sum;p=ha->next;q=hb->next;pre=ha;while(p!=NULL&&q!=NULL) {if(p->exp<q->exp) {pre->next=p;pre=pre->next;p=p->next;}else if(p->exp==q->exp){sum=p->coef+q->coef;if(sum!=0) {p->coef=sum;pre->next=p;pre=pre->next;p=p->next;temp=q;q=q->next;free(temp);}else //如果系数和为零,则删除结点p与q,并将指针指向下一个结点{temp=p->next;free(p);p=temp;temp=q->next;free(q);q=temp;} }else {pre->next=q;pre=pre->next;q=q->next;} }if(p!=NULL) //将多项式A中剩余的结点加入到和多项式中pre->next=p;else pre->next=q;return ha;}PolyNode *subduction(PolyNode *ha, PolyNode *hb)//一元多项式相减函数,用于将两个多项式相减,然后将差多项式存放在多项式ha中,并将多项式hb删除{PolyNode *p,*q,*pre,*temp;int sum;p=ha->next;q=hb->next;pre=ha;while(p!=NULL&&q!=NULL) {if(p->exp<q->exp) {pre->next=p;pre=pre->next;p=p->next;}else if(p->exp==q->exp){sum=p->coef-q->coef;if(sum!=0) {p->coef=sum;pre->next=p;pre=pre->next;p=p->next;temp=q;q=q->next;free(temp);}else //如果系数和为零,则删除结点p与q,并将指针指向下一个结点{temp=p->next;free(p);p=temp;temp=q->next;free(q);q=temp;} }else {pre->next=q;pre=pre->next;q=q->next;} }if(p!=NULL) //将多项式A中剩余的结点加入到和多项式中pre->next=p;else pre->next=q;return ha;}main(){ int a=-1;PolyNode *h1,*h2,*h;h1=Creatpoly();printf("该多项式为P1(x)=");UnitePoly(h1);Insortup(h1);Prin_poly(h1);printf("\n");h2=Creatpoly();printf("该多项式为P2(x)=");UnitePoly(h2);Insortup(h2);Prin_poly(h2);printf("\n");printf("输入1查看两多项式相加结果\n输入2查看两多项式相减结果\n输入3查看两多项式相乘结果\n");scanf("%d",&a);if(a==1){printf("相加后的多项式\n");h=addition(h1,h2);UnitePoly(h);printf("按X的升幂排列");Insortup(h);Prin_poly(h);printf("\n");printf("按X的降幂排列");Insortdown(h);Prin_poly(h);printf("\n");}if(a==2){printf("相减后的多项式\n"); h=subduction(h1,h2); UnitePoly(h);printf("按X的升幂排列"); Insortup(h);Prin_poly(h);printf("\n");printf("按X的降幂排列"); Insortdown(h);Prin_poly(h);printf("\n");}if(a==3){printf("相乘后的多项式为\n"); h=polymuti(h1,h2); UnitePoly(h);printf("按X的升幂排列"); Insortup(h);Prin_poly(h);printf("\n");printf("按X的降幂排列");Insortdown(h);Prin_poly(h);printf("\n");}if(a!=1&&a!=2&&a!=3)printf("输入有误");return 0;}。