多项式算法.docx
《多项式算法.docx》由会员分享,可在线阅读,更多相关《多项式算法.docx(15页珍藏版)》请在冰豆网上搜索。
多项式算法
#include
typedefstruct
{floatcoef;//系数
intexpn;//指数
}term;
typedefstructLNode
{termdata;//term多项式值
structLNode*next;
}LNode,*LinkList;
typedefLinkListpolynomail;
/*比较指数*/
intcmp(terma,termb)
{if(a.expn>b.expn)return1;
if(a.expn==b.expn)return0;
if(a.expnelseexit(-2);}/*由小到大排列*/voidarrange1(polynomailpa){polynomailh=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指向参与比较的最后一个,不断向前移动}}/*由大到小排序*/voidarrange2(polynomailpa){polynomailh=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指向参与比较的最后一个,不断向前移动}}/*打印多项式,求项数*/intprintpolyn(polynomailP){inti;polynomailq;if(P==NULL)printf("无项!\n");elseif(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");return1;}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;}}}return1;}/*1、创建并初始化多项式链表*/polynomailcreatpolyn(polynomailP,intm){polynomailr,q,p,s,Q;inti;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;}}returnP;}/*2、两多项式相加*/polynomailaddpolyn(polynomailpa,polynomailpb){polynomails,newp,q,p,r;intj;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;case0: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;case1:s->data.coef=q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;break;}//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;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);returnnewp;}/*3、两多项式相减*/polynomailsubpolyn(polynomailpa,polynomailpb){polynomails,newp,q,p,r,Q;intj;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;case0: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;case1:s->data.coef=-q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;break;}//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);returnnewp;}/*4两多项式相乘*/polynomailmulpolyn(polynomailpa,polynomailpb){polynomails,newp,q,p,r;inti=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);}}returnnewp;}/*5、销毁已建立的两个多项式*/voiddelpolyn(polynomailpa,polynomailpb){polynomailp,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");}voidmain(){polynomailpa=NULL,pb=NULL;polynomailp,q;polynomailaddp=NULL,subp=NULL,mulp=NULL;intn,m;intsign='y';printf("1、创建两个一元多项式\n");printf("2、两多项式相加得一新多项式\n");printf("3、两多项式相减得一新多项式\n");printf("4、两多项式相乘得一新多项式\n");printf("5、销毁已建立的两个多项式\n");printf("6、退出\n");printf("\n");while(sign!='n'){printf("请选择:");scanf("%d",&n);switch(n){case1: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);pb=creatpolyn(pb,m);printpolyn(pb);break;case2:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}addp=addpolyn(pa,pb);printpolyn(addp);break;case3:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}subp=subpolyn(pa,pb);printpolyn(subp);break;case4:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}mulp=mulpolyn(pa,pb);printpolyn(mulp);break;case5:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}delpolyn(pa,pb);pa=pb=NULL;break;case6: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);}}exit(-2);}//switch}//while}
elseexit(-2);
}
/*由小到大排列*/
voidarrange1(polynomailpa)
{polynomailh=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指向参与比较的最后一个,不断向前移动
}}
/*由大到小排序*/
voidarrange2(polynomailpa)
=r;)//小的沉底
if(cmp(p->next->next->data,p->next->data)==1)
/*打印多项式,求项数*/
intprintpolyn(polynomailP)
{inti;
polynomailq;
if(P==NULL)printf("无项!
\n");
elseif(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!
printf("%.2f",q->data.coef);//打印第一项
q=q->next;
if(q==NULL)
{printf("\n");return1;}
while
(1)//while中,打印剩下项中系数非零的项,
{if(q->data.coef!
{if(q->data.coef>0)printf("+");
printf("%.2fX^%d",q->data.coef,q->data.expn);i++;
printf("%f",q->data.coef);
{printf("\n");break;}
return1;
/*1、创建并初始化多项式链表*/
polynomailcreatpolyn(polynomailP,intm)
{polynomailr,q,p,s,Q;
inti;
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;}}returnP;}/*2、两多项式相加*/polynomailaddpolyn(polynomailpa,polynomailpb){polynomails,newp,q,p,r;intj;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;case0: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;case1:s->data.coef=q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;break;}//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;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);returnnewp;}/*3、两多项式相减*/polynomailsubpolyn(polynomailpa,polynomailpb){polynomails,newp,q,p,r,Q;intj;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;case0: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;case1:s->data.coef=-q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;break;}//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);returnnewp;}/*4两多项式相乘*/polynomailmulpolyn(polynomailpa,polynomailpb){polynomails,newp,q,p,r;inti=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);}}returnnewp;}/*5、销毁已建立的两个多项式*/voiddelpolyn(polynomailpa,polynomailpb){polynomailp,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");}voidmain(){polynomailpa=NULL,pb=NULL;polynomailp,q;polynomailaddp=NULL,subp=NULL,mulp=NULL;intn,m;intsign='y';printf("1、创建两个一元多项式\n");printf("2、两多项式相加得一新多项式\n");printf("3、两多项式相减得一新多项式\n");printf("4、两多项式相乘得一新多项式\n");printf("5、销毁已建立的两个多项式\n");printf("6、退出\n");printf("\n");while(sign!='n'){printf("请选择:");scanf("%d",&n);switch(n){case1: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);pb=creatpolyn(pb,m);printpolyn(pb);break;case2:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}addp=addpolyn(pa,pb);printpolyn(addp);break;case3:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}subp=subpolyn(pa,pb);printpolyn(subp);break;case4:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}mulp=mulpolyn(pa,pb);printpolyn(mulp);break;case5:if(pa==NULL){printf("请先创建两个一元多项式!\n");break;}delpolyn(pa,pb);pa=pb=NULL;break;case6: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);}}exit(-2);}//switch}//while}
{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);
{r=r->next;
p=p->next;
returnP;
/*2、两多项式相加*/
polynomailaddpolyn(polynomailpa,polynomailpb)
{polynomails,newp,q,p,r;intj;
p=pa->next;q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
switch(cmp(p->data,q->data))
{case-1:
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
break;
case0:
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;
case1:
s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
}//switch
}//while
while(p)
while(q)
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);
returnnewp;
/*3、两多项式相减*/
polynomailsubpolyn(polynomailpa,polynomailpb)
{polynomails,newp,q,p,r,Q;intj;
s->data.coef=p->data.coef-q->data.coef;
s->data.coef=-q->data.coef;
if(newp->next!
=NULL&&newp->next->next!
=NULL)//合并同类项
{for(q=newp->next;q!
=NULL;q=q->next)
free(Q);}
p=p->next;}
}printf("升序1,降序2\n");
returnnewp;}
/*4两多项式相乘*/
polynomailmulpolyn(polynomailpa,polynomailpb)
{polynomails,newp,q,p,r;
inti=20,j;
for(p=pa->next;p!
for(q=pb->next;q!
s->data.coef=p->data.coef*q->data.coef;
s->data.expn=p->data.expn+q->data.expn;
r=s;}
for(;i!
=0;i--)
{for(q=newp->next;q->next!
p->next=p->next->next;free(r);
/*5、销毁已建立的两个多项式*/
voiddelpolyn(polynomailpa,polynomailpb)
{polynomailp,q;
p=pa;
while(p!
{q=p;
free(q);
p=pb;
printf("两个多项式已经销毁\n");
voidmain()
{polynomailpa=NULL,pb=NULL;
polynomailp,q;
polynomailaddp=NULL,subp=NULL,mulp=NULL;
intn,m;
intsign='y';
printf("1、创建两个一元多项式\n");
printf("2、两多项式相加得一新多项式\n");
printf("3、两多项式相减得一新多项式\n");
printf("4、两多项式相乘得一新多项式\n");
printf("5、销毁已建立的两个多项式\n");
printf("6、退出\n");
printf("\n");
while(sign!
='n')
{printf("请选择:
scanf("%d",&n);
switch(n)
{case1:
if(pa!
{printf("已建立两个一元多项式,请选择其他操作!
printf("请输入第一个多项式:
printf("要输入几项:
scanf("%d",&m);
while(m==0)
{printf("m不能为0,请重新输入m:
pa=creatpolyn(pa,m);
printpolyn(pa);
printf("请输入第二个多项式:
pb=creatpolyn(pb,m);
printpolyn(pb);
case2:
if(pa==NULL)
{printf("请先创建两个一元多项式!
addp=addpolyn(pa,pb);
printpolyn(addp);
case3:
subp=subpolyn(pa,pb);
printpolyn(subp);
case4:
mulp=mulpolyn(pa,pb);
printpolyn(mulp);
case5:
delpolyn(pa,pb);
pa=pb=NULL;
case6:
if(addp!
{p=addp;
if(subp!
{p=subp;
exit(-2);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1