一元多项式的加法减法乘法的实现

合集下载

数据结构课程设计-一元多项式的加法、减法、乘法的实现

数据结构课程设计-一元多项式的加法、减法、乘法的实现

数据结构课程设计-一元多项式的加法、减法、乘法的实现一、设计题目一元多项式的加法、减法、乘法的实现。

二、主要内容设有一元多项式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语言一元多项式的加法,减法,乘法的实现

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++,c)

一元多项式的各种运算实现(c++,c)
{
float a=1.0;
for(int i=1;i<=k;i++)
a=a*1e-1;
return a;
}
//赋值,参数是指向头结点的指针
void fuzhi(node *&toup)
{
float fumi(int k);
void init(node *&toup);
if(!toup) init(toup);
if(toup) destory(toup);//假如有头结点或元素节点,销毁结点
toup=(node*)malloc(sizeof(node));
if(!toup){cout<<"溢出错误"<<endl;exit(0ext=NULL;
}
//销毁全部,包括头结点
cout<<"*******************************************************************************"<<endl;
cout<<"举例:3 x3 9.3x-3 -x....."<<endl;
}
//求未知数指数是-k时的值
float fumi(int k)
while(p)
{
if(p->data ==0)
{
if(!pr)
{
tem=p;
toup->next =p->next ;
p=p->next ;
toup->length--;
free(tem);
tem=NULL;

数据结构 线性结 一元多项式的加法乘法实现

数据结构 线性结  一元多项式的加法乘法实现
5x20-4x4-5x2+9x-2
求解思路
1.多项式表示 2. 程序框架 3. 读多项式 4. 加法实现 5. 乘法实现 6. 多项式输出
多项式的表示
仅表示非零项
数组: 编程简单、调试容易
需要事先确定数组大小
一种比较好的实现方法是: 动态数组
链表:
动态性强 编程略为复杂、调试比较困难
while (t1 && t2) {
if (t1->expon == t2->expon) {
…..
}
else if (t1->expon > t2->expon) {
……
}
else {
……
}
}
while (t1) {
return 0; }
如何读入多项式
Polynomial ReadPoly() {
…… scanf("%d", &N); …… while ( N-- ) {
scanf("%d %d", &c, &e); Attach(c, e, &Rear); } ….. return P; }
4 3 4 -5 2 6 1 -2 0
两种处理方法: 1. Rear初值为NULL
在Attach函数中根据Rear是 否为NULL做不同处理
Attach
ce
Rear (当前结果表达式尾项指针)
Rear
如何读入多项式
Polynomial ReadPoly() {
…… scanf("%d", &N); …… while ( N-- ) {
多项式的乘积: (a+b)(c+d) = ac+ad+bc+bd

一元多项式的运算

一元多项式的运算

数据结构课程设计实验报告专业班级:学号:姓名:2011年1月1日题目:一元多项式的运算1、题目描述一元多项式的运算在此题中实现加、减法的运算,而多项式的减法可以通过加法来实现(只需在减法运算时系数前加负号)。

在数学上,一个一元n次多项式P n(X)可按降序写成:P n(X)= P n X^n+ P(n-1)X^(n-1)+......+ P1X+P0它由n+1个系数惟一确定,因此,在计算机里它可以用一个线性表P来表示:P=(P n,P(n-1),......,P1,P0)每一项的指数i隐含在其系数P i的序号里。

假设Q m(X)是一元m次多项式,同样可以用一个线性表Q来表示:Q=(q m,q(m-1),.....,q1,q0)不是一般性,假设吗吗m<n,则两个多想是相加的结果:R n(X)= P n(X)+ Q m(X)很显然,可以对P,Q和R采用顺序存储结构,使得多项式相加的算法定义和实现简单化。

然而,在通常的应用中,多项式的次数可能变化很大而且很高,使得顺序存储结构的最大长度很难确定。

特别是在处理项数少且次数特别高的情况下,对内存空间的浪费是相当大的。

因此,一般情况下,都采用链式存储结构来处理多项式的运算,使得两个线性链表分别表示一元多项式P n(X)和Q m(X),每个结点表示多项式中的一项。

通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就是去了意义,在计算机内要表示一个多项式,至少具有以下数据信息:系数信息、指数信息和指向下一个单项式的指针。

通过指针,我们就可以把多个单项式连接起来,形成一个多项式。

2、任务要求系数定义的是float型,范围是3.4*10^-38~3.4*10^38;指数定义的是int型,范围是-2147483648~+2147483647;输入多项式系数及指数,系统会自动将系数转化为浮点型。

功能:(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();}。

一元多项式的相加减

一元多项式的相加减

实验一一元多项式的表示和相减、相乘一、实验目的1.掌握链表的存储方式2.掌握一元多项式的存储及运算。

二、实验内容已知一元多项式P(x)和Q(x)已存在,求P(x)-Q(x)和P(x)* Q(x)并输出。

要求:1.通过键盘随机输入两多项式P(x)和Q(x)的内容。

2.输出结果要有P(x)和Q(x)的以及它们的差P(x)-Q(x)和乘积P(x)* Q(x)。

三、实验步骤:1.创建一元多项P(x)和Q(x)。

2.求P(x)-Q(x),P(x)* Q(x)。

3.输出P(x)、Q(x)、P(x)-Q(x),P(x)* Q(x)。

四、算法说明首先,定义一元多项式的存储方式,然后从键盘输入P(x)和Q(x)对应多项式的各对系数和指数,建立相应的一元多项式五、测试结果参考下图多项式相减多项式相乘六、源代码1.多项式的相减# include<stdio.h># include<malloc.h>typedef struct{float coef; //系数int expn; //指数}ElemType;typedef struct LNode{ //结点类型ElemType data;struct LNode *next;}*LinkList;void MakeNode(LinkList &s,ElemType e){ //生成结点s=(LinkList)malloc(sizeof(LNode));s->data=e;}void InsAfter(LinkList p,LinkList s){//插入结点s->next=p->next;p->next=s;}int compare(ElemType e1,ElemType e2){//比较if(e1.expn>e2.expn)return 1;else if(e1.expn<e2.expn)return -1;return 0;}void OrderInsert(LinkList &L,ElemType e,int(*compare)(ElemType,ElemType)){//有序插入LinkList p=L,q=p->next,s;while(q){int n=compare(e,q->data);if(n<0){MakeNode(s,e);InsAfter(p,s);break;}else if(n==0){q->data.coef=q->data.coef+e.coef;if(q->data.coef==0){p->next=q->next;free(q);} break;}p=p->next;q=p->next;}if(q==NULL){MakeNode(s,e);InsAfter(p,s); //最大,放在最后一个位置}}void InitList(LinkList &L){//初始化L=(LinkList)malloc(sizeof(LNode));L->next=NULL;}void SetCurElem(LinkList &p,ElemType e){ //设置结点p->data.coef=e.coef;p->data.expn=e.expn;}void CreatePolyn(LinkList &L,int m){InitList(L);ElemType e;e.coef=0.0;e.expn=-1;SetCurElem(L,e);//设置头结点的数据元素printf("请输入%d对多项式的值:\n",m);for(int i=1;i<=m;i++){scanf("%f%d",&e.coef,&e.expn); //输入值OrderInsert(L,e,compare);}}void show(LinkList L){//输出方法LinkList p=L->next;if(p){ //第一个输出printf("%.2fX^%d",p->data.coef,p->data.expn); p=p->next;}while(p){if(p->data.coef>0)printf("+");printf("%.2fX^%d",p->data.coef,p->data.expn); p=p->next;}printf("\n");}void ListDestroy(LinkList &L){//销毁LinkList p=L,q;while(p){q=p;p=p->next;free(q);}}void subtract(LinkList L1,LinkList L2,LinkList &L3){//多项式相减ElemType e;InitList(L3);e.coef=0.0;e.expn=-1;SetCurElem(L3,e);//设置头结点的数据元素LinkList p1=L1->next,p2=L2->next,q;//r1始终指向新建链表的尾部,p1和p2表示当前结点while(p2){p2->data.coef=-p2->data.coef;p2=p2->next;}p2=L2->next;while(p1&&p2){int n=compare(p1->data,p2->data);switch(n){case -1:{OrderInsert(L3,p1->data,compare);p1=p1->next;break;} //L1中的值小,插入之case 1:{OrderInsert(L3,p2->data,compare);p2=p2->next;break;} //L2中的值小,插入之case 0:{ //相同e.coef=p1->data.coef+p2->data.coef;e.expn=p1->data.expn;if(e.coef!=0){OrderInsert(L3,e,compare);}p1=p1->next;p2=p2->next;break;}}}if(p1){OrderInsert(L3,p1->data,compare);p1=p1->next;} //添加L1else if(p2){OrderInsert(L3,p2->data,compare);p2=p2->next;} //添加L2 }LinkList FindThan( LinkList X, LinkList L ){LinkList Tmp;Tmp = L;while( Tmp->next != NULL && Tmp->next->data.expn >= X->data.expn ) {Tmp = Tmp->next;}return Tmp;}int main(){LinkList L1,L2,L3,L4;int m,n;printf("请输入多项式P(X)的项数:");scanf("%d",&m);CreatePolyn(L1,m);printf("多项式P(X)为:\n");show(L1);printf("请输入多项式Q(X)的项数:");scanf("%d",&n);CreatePolyn(L2,n);printf("多项式Q(X)为:\n");show(L2);subtract(L1,L2,L3);printf("多项式P(X)-Q(X)为:\n");show(L3);return 0;}2.多项式的相乘# include<stdio.h># include<malloc.h>typedef struct{float coef; //系数int expn; //指数}ElemType;typedef struct LNode{ //结点类型ElemType data;struct LNode *next;}*LinkList;void MakeNode(LinkList &s,ElemType e){//生成结点s=(LinkList)malloc(sizeof(LNode));s->data=e;}void InsAfter(LinkList p,LinkList s){//插入结点s->next=p->next;p->next=s;}int compare(ElemType e1,ElemType e2){//比较if(e1.expn>e2.expn)return 1;else if(e1.expn<e2.expn)return -1;return 0;}void OrderInsert(LinkList &L,ElemType e,int(*compare)(ElemType,ElemType)){//有序插入LinkList p=L,q=p->next,s;while(q){int n=compare(e,q->data);if(n<0){MakeNode(s,e);InsAfter(p,s);break;}else if(n==0){q->data.coef=q->data.coef+e.coef;if(q->data.coef==0){p->next=q->next;free(q);} break;}p=p->next;q=p->next;}if(q==NULL){MakeNode(s,e);InsAfter(p,s); //最大,放在最后一个位置}}void InitList(LinkList &L){//初始化L=(LinkList)malloc(sizeof(LNode));L->next=NULL;}void SetCurElem(LinkList &p,ElemType e){ //设置结点p->data.coef=e.coef;p->data.expn=e.expn;void CreatePolyn(LinkList &L,int m){InitList(L);ElemType e;e.coef=0.0;e.expn=-1;SetCurElem(L,e);//设置头结点的数据元素printf("请输入%d对多项式的值:\n",m);for(int i=1;i<=m;i++){scanf("%f%d",&e.coef,&e.expn); //输入值OrderInsert(L,e,compare);}}void show(LinkList L){//输出方法LinkList p=L->next;if(p){ //第一个输出printf("%.2fX^%d",p->data.coef,p->data.expn); p=p->next;}while(p){if(p->data.coef>0)printf("+");printf("%.2fX^%d",p->data.coef,p->data.expn); p=p->next;}printf("\n");}void ListDestroy(LinkList &L){//销毁LinkList p=L,q;while(p){q=p;p=p->next;free(q);}}void Multiply(LinkList L1,LinkList L2,LinkList &L3){//多项式相乘ElemType e;InitList(L3);e.coef=0.0;e.expn=-1;SetCurElem(L3,e);//设置头结点的数据元素LinkList p1=L1->next,p2=L2->next,q;//r1始终指向新建链表的尾部,p1和p2表示当前结点while(p1){p2=L2->next;while(p2){e.coef=p1->data.coef*p2->data.coef;e.expn=p1->data.expn+p2->data.expn;OrderInsert(L3,e,compare);p2=p2->next;}p1=p1->next;} }int main(){LinkList L1,L2,L3;int m,n;printf("请输入多项式P(X)的项数:");scanf("%d",&m);CreatePolyn(L1,m);printf("多项式P(X)为:\n");show(L1);printf("请输入多项式Q(X)的项数:");scanf("%d",&n);CreatePolyn(L2,n);printf("多项式Q(X)为:\n");show(L2);Multiply(L1,L2,L3);printf("多项式P(X)*Q(X)为:\n");show(L3);return 0;}七、分析总结本程序从源代码开始经过多次调试,一开始创建多项式并没有遇到什么问题,但是减法开始遇到问题,好在经过调试和反复检验后问题都得以解决,在多项式相加的基础上修改,相减和相乘就容易得多。

数据结构课程设计报告一元多项式加减乘计算

数据结构课程设计报告一元多项式加减乘计算

《数据结构》课程设计多项式计算班级:学号:姓名:指导老师:多项式计算1、问题描述能够按照指数降序排列建立多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出。

2、设计思路这个程序的关键是多项式的创建和排列,以及相乘时系数相乘和指数相加、相加时相同指数的系数相加、相减时相同指数的系数相减。

由于多项式拥有指数和系数(假设基数已定),所以可以定义一个包含指数系数的结构体,用单链表存储多项式的数据,所以结构体包含next指针。

数据插入时比较两数的指数,按照降序排序,从表头的next开始,直至找到合适的位置,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。

输入完数据后选择计算方式(相乘、相加、相减),多项式运算时要循环遍历整个多项式,多项式的每一组数据都要和另一个多项式整组数据相运算(每一个运算值都存储到新建的“多项式”链表中),直到两个多项式都遍历完结束。

3、数据结构设计在模拟多项式对象时,为了简化处理,只取最核心的两个数据:多项式的系数和指数。

前面提到,要用单链表操作,所以要加上个next指针,再由该结构体定义一个结点类型和指针类型。

具体数据结构定义如下:typedef struct node{int xs; /*系数*/int zs; /*指数*/struct node * next; /*next指针*/}Dnode,* Dnodelist;4、功能函数设计(1)链表初始化函数Creat_node()带有头结点的头指针指向空(NULL)。

(2)多项式数据的创建函数Creat_Dmeth()当链表初始化成功后,开始创建多项式。

分别循环输入两个多项式的系数和指数,其中要用到插入函数。

(3)数据的插入函数Insert_node()当创建多项式时,要用到此函数,即利用插入的方式将多项式的数据连接起来。

再输入一组数据后,程序自动调用此函数,插入时也进行着排序,从表头的next开始,一一比较指数大小,直到大于或等于当前指向的数据或遍历完所有数据时停止,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。

数据结构课程设计报告一元多项式加减乘除

数据结构课程设计报告一元多项式加减乘除

数学与计算机学院课程设计说明书课程名称: 数据结构课程设计课程代码: 8404181题目:一元多项式运算的实现年级/专业/班: 2009-计科-3学生姓名:学号: 312009*********开始时间:2011 年06 月13日完成时间:2011 年06月21 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书撰写质量(45)总分(100)指导教师签名:年月日目录1 引言 (1)1.1问题的提出 (1)1.2国内外研究的现状 (1)1.3任务与分析 (1)2程序的主要功能 (2)2.1一元多项式创建 (2)2.2一元多项式的加法 (2)2.3一元多项式的减法 (2)2.4一元多项式的乘法 (2)2.5一元多项式项的指数比较 (2)2.6一元多项式运算结果升降排序 (2)2.7一元多项式的输出 (3)2.8一元多项式的销毁 (3)3 程序运行平台 (4)4 总体设计 (5)5 程序类的说明 (6)6 模块分析 (7)6.1创建模块 (8)6.2一元多项式的加法 (10)6.3一元多项式相减 (12)6.4一元多项式相乘 (15)6.5一元多项式输出结果按项的指数排序 (17)6.6一元多项式运算系统实现 (21)7系统测试 (32)8 结论 (38)摘要随着计算机的普及,对数学中一元多项式的研究也逐渐普及,计算机程序员通过对其结构的分析,针对其特殊的结构,利用不同的计算机设计语言编程利用计算机系统实现了对一元多项式的一系列操作。

本课程设计中主要利用C、C++语言编写程序实现了稀疏一元多项式的简单运算系统,该系统具有一元多项式顺序和动态两种存储结构,实现了一元多项式的加法、减法、乘法运算等功能。

关键词:计算机; 一元多项式; C;C++;顺序存储;动态存储1 引言1.1 问题的提出随着计算机的不断发展,计算机的线性表的应用越来越广泛,如今线性表在计算器程序上的应用已达非常成熟的阶段。

数据结构课程设计——一元多项式加法、减法、乘法运算的实现

数据结构课程设计——一元多项式加法、减法、乘法运算的实现

1.一元多项式加法、减法、乘法运算的实现 1.1设计内容及要求 1)设计内容(1)使用顺序存储结构实现多项式加、减、乘运算。

例如:10321058)(2456+-+-+=x x x x x x f ,x x x x x x g +--+=23451020107)( 求和结果:102220128)()(2356++-+=+x x x x x g x f (2)使用链式存储结构实现多项式加、减、乘运算,10305100)(1050100+-+=x x x x f ,x x x x x x g 320405150)(10205090+++-= 求和结果:1031040150100)()(102090100++-++=+x x x x x x g x f 2)设计要求(1)用C 语言编程实现上述实验内容中的结构定义和算法。

(2)要有main()函数,并且在main()函数中使用检测数据调用上述算法。

(3)用switch 语句设计如下选择式菜单。

***************数据结构综合性实验**************** *******一、多项式的加法、减法、乘法运算********** ******* 1.多项式创建 ********** ******* 2.多项式相加 ********** ******* 3.多项式相减 ***************** 4.多项式相乘 ********** ******* 5.清空多项式 ********** ******* 0.退出系统 ********** ******* 请选择(0—5) ********** ************************************************* *请选择(0-5):1.2数据结构设计根据下面给出的存储结构定义:#define MAXSIZE 20 //定义线性表最大容量//定义多项式项数据类型typedef struct{float coef; //系数int expn; //指数}term,elemType;typedef struct{term terms[MAXSIZE]; //线性表中数组元素int last; //指向线性表中最后一个元素位置}SeqList;typedef SeqList polynomial;1.3基本操作函数说明polynomial*Init_Polynomial();//初始化空的多项式int PloynStatus(polynomial*p)//判断多项式的状态int Location_Element(polynomial*p,term x)在多项式p中查找与x项指数相同的项是否存在int Insert_ElementByOrder(polynomial*p,term x)//在多项式p中插入一个指数项xint CreatePolyn(polynomial*P,int m)//输入m项系数和指数,建立表示一元多项式的有序表pchar compare(term term1,term term2)//比较指数项term1和指数项term2polynomial*addPloyn(polynomial*p1,polynomial*p2)//将多项式p1和多项式p2相加,生成一个新的多项式polynomial*subStractPloyn(polynomial*p1,polynomial*p2) //多项式p1和多项式p2相减,生成一个新的多项式polynomial*mulitPloyn(polynomial*p1,polynomial*p2)//多项式p1和多项式p2相乘,生成一个新的多项式void printPloyn(polynomial*p)//输出在顺序存储结构的多项式p1.4程序源代码#include<stdlib.h>#include<stdio.h>#include<iostream.h>#define NULL 0#define MAXSIZE 20typedef struct{float coef;int expn;}term,elemType;typedef struct{term terms[MAXSIZE];int last;}SeqList;typedef SeqList polynomial;void printPloyn(polynomial*p);int PloynStatus(polynomial*p){if(p==NULL){return -1;}else if(p->last==-1){return 0;}else{return 1;}}polynomial*Init_Polynomial(){polynomial*P;P=new polynomial;if(P!=NULL){P->last=-1;return P;}else{return NULL;}}void Reset_Polynomial(polynomial*p){if(PloynStatus(p)==1){p->last=-1;}}int Location_Element(polynomial*p,term x){int i=0;if(PloynStatus(p)==-1)return 0;while(i<=p->last && p->terms[i].expn!=x.expn) {i++;}if(i>p->last){return 0;}else{return 1;}}int Insert_ElementByOrder(polynomial*p,term x) {int j;if(PloynStatus(p)==-1)return 0;if(p->last==MAXSIZE-1){cout<<"The polym is full!"<<endl;return 0;}j=p->last;while(p->terms[j].expn<x.expn && j>=0){p->terms[j+1]=p->terms[j];j--;}p->terms[j+1]=x;p->last++;return 1;}int CreatePolyn(polynomial*P,int m){float coef;int expn;term x;if(PloynStatus(P)==-1)return 0;if(m>MAXSIZE){printf("顺序表溢出\n");return 0;}else{printf("请依次输入%d对系数和指数...\n",m);for(int i=0;i<m;i++){scanf("%f%d",&coef,&expn);x.coef=coef;x.expn=expn;if(!Location_Element(P,x)){Insert_ElementByOrder(P,x);}}}return 1;}char compare(term term1,term term2){if(term1.expn>term2.expn){return'>';}else if(term1.expn<term2.expn){return'<';}else{return'=';}}polynomial*addPloyn(polynomial*p1,polynomial*p2){int i,j,k;i=0;j=0;k=0;if((PloynStatus(p1)==-1)||(PloynStatus(p2)==-1)){return NULL;}polynomial*p3=Init_Polynomial();while(i<=p1->last && j<=p2->last){switch(compare(p1->terms[i],p2->terms[j])){case'>':p3->terms[k++]=p1->terms[i++];p3->last++;break;case'<':p3->terms[k++]=p2->terms[j++];p3->last++;break;case'=':if(p1->terms[i].coef+p2->terms[j].coef!=0){p3->terms[k].coef=p1->terms[i].coef+p2->terms[j].coef;p3->terms[k].expn=p1->terms[i].expn;k++;p3->last++;}i++;j++;}}while(i<=p1->last){p3->terms[k++]=p1->terms[i++];p3->last++;}return p3;}polynomial*subStractPloyn(polynomial*p1,polynomial*p2){int i;i=0;if((PloynStatus(p1)!=1)||(PloynStatus(p2)!=1)){return NULL;}polynomial*p3=Init_Polynomial();p3->last=p2->last;for(i=0;i<=p2->last;i++){p3->terms[i].coef=-p2->terms[i].coef;p3->terms[i].expn=p2->terms[i].expn;}p3=addPloyn(p1,p3);return p3;}polynomial*mulitPloyn(polynomial*p1,polynomial*p2){int i;int j;int k;i=0;if((PloynStatus(p1)!=1)||(PloynStatus(p2)!=1)){return NULL;}polynomial*p3=Init_Polynomial();polynomial**p=new polynomial*[p2->last+1];for(i=0;i<=p2->last;i++){for(k=0;k<=p2->last;k++){p[k]=Init_Polynomial();p[k]->last=p1->last;for(j=0;j<=p1->last;j++){p[k]->terms[j].coef=p1->terms[j].coef*p2->terms[k].coef;p[k]->terms[j].expn=p1->terms[j].expn+p2->terms[k].expn;}p3=addPloyn(p3,p[k]);}}return p3;}void printPloyn(polynomial*p){int i;for(i=0;i<=p->last;i++){if(p->terms[i].coef>0 && i>0)cout<<"+"<<p->terms[i].coef;elsecout<<p->terms[i].coef;cout<<"x^"<<p->terms[i].expn;}cout<<endl;}void menu(){cout<<"\t\t*******数据结构综合性实验*********"<<endl;cout<<"\t\t***一、多项式的加、减、乘法运算***"<<endl;cout<<"\t\t******* 1.多项式创建 *********"<<endl;cout<<"\t\t******* 2.多项式相加 *********"<<endl;cout<<"\t\t******* 3.多项式相减 *********"<<endl;cout<<"\t\t******* 4.多项式相乘 *********"<<endl;cout<<"\t\t******* 5.清空多项式 *********"<<endl;cout<<"\t\t******* 0.退出系统 *********"<<endl;cout<<"\t\t****** 请选择(0-5) ********"<<endl;cout<<"\t\t***********************************"<<endl; }void main(){int sel;polynomial*p1=NULL;polynomial*p2=NULL;polynomial*p3=NULL;while(1){menu();cout<<"\t\t*请选择(0-5):";cin>>sel;switch(sel){case 1:p1=Init_Polynomial();p2=Init_Polynomial();int m;printf("请输入第一个多项式的项数:\n");scanf("%d",&m);CreatePolyn(p1,m);printf("第一个多项式的表达式为p1=");printPloyn(p1);printf("请输入第二个多项式的项数:\n");scanf("%d",&m);CreatePolyn(p2,m);printf("第二个多项式的表达式为p2=");printPloyn(p2);break;case 2:printf("p1+p2=");if((p3=subStractPloyn(p1,p2))!=NULL)printPloyn(p3);break;case 3:printf("\np1-p2=");if((p3=subStractPloyn(p1,p2))!=NULL)printPloyn(p3);break;case 4:printf("\np1*p2=");if((p3=mulitPloyn(p1,p2))!=NULL)printPloyn(p3);case 5:Reset_Polynomial(p1);Reset_Polynomial(p2);Reset_Polynomial(p3);break;case 0:return;}}return;}1.5程序执行结果2.迷宫问题实现2.1设计内容及要求1)设计内容以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

一元符号多项式的四则运算讲解

一元符号多项式的四则运算讲解

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^63.主要代码展示://**** 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 {cout<<pt->coef<<"x^"<<pt->expn;}pt=pt->next;}while (pt){if(pt->expn==0){cout<<pt->coef;}else {if(pt->coef<0){cout<<pt->coef<<"x^"<<pt->expn;}else {cout<<"+"<<pt->coef<<"x^"<<pt->expn;}}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;cout<<"系数,指数:";cin>>c>>e;while (c){PNode *p=new PNode(c,e);Insert(p);cout<<"系数,指数:";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; cout<<"本函数的功能列表:"<<endl;cout<<"1.多项式的加法:"<<endl;cout<<"2.多项式的减法:"<<endl;cout<<"3.多项式的乘法:"<<endl;cout<<"4.选择重建多项式:"<<endl;cout<<"5.结束运算\n"<<endl;cout<<"依次输入PA各项系数和指数(以输入系数0项结束),建立多项式:"<<endl;PA.CreatPoly();PA.Print();cout<<"依次输入PB各项系数和指数(以输入系数0项结束),建立多项式:"<<endl;PB.CreatPoly();PB.Print();cout<<"\n请输入功能序号进行多项式的运算:";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;cout<<"输入0修改多项式PA,其他数字保留多项式PA:";cin>>flag;if(!flag){PA.CreatPoly();PA.Print();}cout<<"输入0修改多项式PB,其他数字保留多项式PB:";cin>>flag;if(!flag){PB.CreatPoly();PB.Print();}break;}case 5:{cout<<"运算结束"<<endl;return 0;}}//switchcout<<"\n是否需要继续,请再次输入选择:";cin>>index;}//whilereturn 0;}4.项目结果展示三、实践体会在此次的C++开放项目试验中,我承担了用C++实现一元符号多项式的四则运算,将所学C++知识运用实战编程中去,并及时进行知识的查缺补漏,帮助我更好的掌握了C++这门语言。

顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。

顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。

顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。

课程设计(数据结构)班级姓名学号指导教师二○一○年七月十日课程设计任务书及成绩评定课题名称顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。

Ⅰ、题目的目的和要求1、设计目的巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。

(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。

(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。

2、设计题目要求(给出你所选择的题目的要求描述)1)首先判定多项式是否稀疏2)分别采用顺序和动态存储结构实现;3)结果M(x)中无重复阶项和无零系数项;4)要求输出结果的升幂和降幂两种排列情况;Ⅱ、设计进度及完成情况Ⅲ、主要参考文献及资料[1] 严蔚敏.数据结构(C语言版).清华大学出版社,2007[2] 严蔚敏.数据结构题集(C语言版).清华大学出版社,2007[3] 谭浩强.C语言程序设计.清华大学出版社,2005[4] 与所用编程环境相配套的C语言或C++相关的资料Ⅳ、成绩评定设计成绩:(教师填写)指导老师:(签字)二○一○年七月十日目录第一章概述 (1)第二章系统分析 (1)第三章概要设计 (2)第四章详细设计 (3)第五章运行与测试 (13)第六章总结与心得 (16)参考文献 (17)本目录是根据正文文档自动生成的,请在报告完成后,更新目录的页码,更新方法如下:1.鼠标单击目录任意部分选中目录;2.单击鼠标右键选择“更新域”;3.在出现的“更新目录”的对话框中选择“只更新页码”,见图1-3,单击“确定”按钮,目录页码将被更新。

更新完成后,最好再核对一下。

图1-3 更新目录页码示意图第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。

数据结构课程设计,一元多项式的加法、减法、乘法的实现

数据结构课程设计,一元多项式的加法、减法、乘法的实现

HUNAN CITY UNIVERSITY 数据结构课程设计报告设计题目:一元多项式的加法、减法、乘法的实现专业:计算机科学与技术(嵌入式)学生姓名:班级学号:分组成员:指导教师:陈强老师2012 年 6月 8日1006402《数据结构》课程设计报告一、设计时间2011年6月4日——6月8日二、设计地点湖南城市学院实验楼计算机房407三、设计目的《数据结构》主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论,是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

该课程的特点是实践性较强,为了学好这门课程,需要在掌握理论知识的同时,加强上机实践。

本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

具体要求如下:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

四、设计小组成员五、指导教师:六、设计课题:顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现设有一元多项式Am(x)和Bn(x).Am(x)=A0+A1x1+A2x2+A3x3+…+A m x mBn(x)=B0+B1x1+B2x2+B3x3+…+B n x n请实现求M(x)=Am(x)+Bn(x)、M(x)=Am(x)-Bn(x)和M(x)=Am(x)×Bn(x)。

题目一元多项式的加法减法乘法的实现

题目一元多项式的加法减法乘法的实现

理学院课程设计说明书课程名称: 数据结构与算法A设计实践课程代码: 6015059 题目一:一元多项式加法、减法、乘法年级/专业/班: 2013/信科/2班学生姓名: 冯金慧学号: 3120130902209 开始时间:2015 年12月28日完成时间:2016 年01 月10 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书撰写质量(45)总分(100)指导教师签名:年月日数据结构与算法A 设计实践任务书 学院名称: 理学院 课程代码:_6015059________专业: 信科 年级: 2012一、 设计题目一元多项式的加法、减法、乘法的实现(限最多1人完成)二、 主要内容完成一无多项式的基本运算功能。

三、具体要求及提交的材料设有一元多项式A m (x)和B n (x).A m (x)=A 0+A 1x 1+A 2x 2+A 3x 3+… +A m x mB n (x)=B 0+B 1x 1+B 2x 2+B 3x 3+… +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)中无重复阶项和无零系数项;要求输出结果的升幂和降幂两种排列情况测试数据及测试结果请在上交的资料中写明;必须上机调试通过按《数据结构课程设计大纲》中的要求完成课程设计报告格式。

设计结束后,每个学生必须上交的材料有:1 《课程设计报告》打印稿一份 2.课程设计的源代码电子文档一份四、主要技术路线提示稀疏的多项式最好采用链式存储结构;两式相减与相加的算法是一致的,只是减式的数据项反号;两式相乘是两式相加的变形。

五、进度安排共计两周时间,建议进度安排如下:1. 选题,应该在上机实验之前完成 2. 需求分析、概要设计可分配4学时完成2. 详细设计可分配4学时 4. 调试和分析可分配10学时。

一元多项式的加法减法乘法和求导

一元多项式的加法减法乘法和求导

一元多项式的加法、减法、乘法和求导一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)1、一元稀疏多项式的加法、减法、乘法和求导法则:假设:f(x) = 3 x^8 + 9 x^5g(x) = 7 x^9 + 3 x则:f(x) + g(x) = 7 x^9 + 3 x^8 + 9 x^5 + 3 xf(x) - g(x) = -7 x^9 + 3 x^8 + 9 x^5 - 3 xf(x) * g(x) = 21 x^17 + 63 x^14 + 9 x^9 + 27 x^6f'(x) = 24 x^7 + 45 x^42、基本思路:首先定义一个结构体,其中定义一元多项式中的两个参数:系数和指数和链表中结点的指针域;然后一一罗列每个在主程序中用到的函数,并一一实现;最后在主程序中主要完成用户的输入和相关函数的调用。

二、【实验设计(Design)】(20%)void insert(PLOYList *head,PLOYList *input)//查找位置插入新链节的函数,且让输入的多项式呈降序排列PLOYList *creat(char ch)//输入多项式PLOYList *add(PLOYList *head,PLOYList *pre)//多项式相加,head为第一个多项式建立的链表表头,pre为第二个多项式建立的链表表头PLOYList *sub(PLOYList *head,PLOYList *pre)//多项式相减PLOYList *mul(PLOYList *head,PLOYList *pre)//多项式相乘PLOYList *der(PLOYList *head)//多项式求导void print(PLOYList *fun)//输出多项式,fun指要输出的多项式链表的表头void start()//用户选择界面主程序:void main(){PLOYList *f,*g,*pf,*hf,*p;int sign=-1;start();while(sign!=0){scanf("%d",&sign);switch(sign){case 0:break;case 1://多项式相加{printf(" 你选择的操作是多项式相加:\n");printf(" 请输入第一个多项式f(x):");f=creat('f');printf(" 第一个多项式为:f(x)=");print(f);printf(" 请输入第二个多项式g(x):");g=creat('g');printf(" 第二个多项式为:g(x)=");print(g);printf(" 结果为:F(x)=f(x)+g(x)=");f=add(f,g);print(f);printf("\n\n");printf(" 继续请选择相应操作,退出请按0. ");break;}case 2://多项式相减{printf(" 你选择的操作是多项式相减:\n");printf(" 请输入第一个多项式f(x):");f=creat('f');printf(" 第一个多项式为:f(x)=");print(f);printf(" 请输入第二个多项式g(x):");g=creat('g');printf(" 第二个多项式为:g(x)=");print(g);printf(" 结果为:F(x)=f(x)-g(x)=");f=sub(f,g);print(f);printf("\n\n");printf(" 继续请选择相应操作,退出请按0. ");break;}case 3://多项式相乘{printf(" 你选择的操作是多项式相乘:\n");printf(" 请输入第一个多项式f(x):");f=creat('f');printf(" 第一个多项式为:f(x)=");print(f);printf(" 请输入第二个多项式g(x):");g=creat('g');printf(" 第二个多项式为:g(x)=");print(g);printf(" 结果为:F(x)=f(x) * g(x)=");pf=mul(f,g);print(pf);printf("\n\n");printf(" 继续请选择相应操作,退出请按0. ");break;}case 4://多项式求导{printf("您选择的是对一个一元多项式求导:\n");printf("请输入一个一元多项式:");f = creat('f');printf("这个多项式为:f(x)= ");print(f);printf("求导结果为:F(x)=f'(x)= ");f=der(f);print(f);printf("\n\n");printf(" 继续请选择相应操作,退出请按0. ");break;}case 5://帮助用户理解输入规则{printf("---------------------------帮助------------------------------\n");printf(" \n");printf(" 1.输入时只输入多项式的系数与指数\n");printf(" 2.输入多项式形式:系数1 指数1 系数2 指数2 …… ,以0 0 结束\n");printf(" 3.例如输入\"1 1 2 2 0 0\" 表示\"1*X^1+2*X^2\" \n");printf(" \n");printf("---------------------------帮助------------------------------\n");printf("\n\n");break;}default:{printf( "看完帮助信息后请重新选择操作\n");break;}}//swith}//while}//void三、【实现描述(Implement)】(30%)1.插入函数,用来对根据用户输入的项建立的单个结点进行排序,使其按照指数降序排列,此函数也可以用在多项式的加减法里,因为加减法实质上也是插入的过程。

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

福建农林大学计算机与信息学院课程设计报告课程名称:数据结构课程设计题目:一元多项式的加法减法乘法的实现姓名:系:软件工程系专业:软件工程专业年级: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()(3)void Insortdown(PolyNode *h)(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){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){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;}。

相关文档
最新文档