C语言多项式运算.docx
《C语言多项式运算.docx》由会员分享,可在线阅读,更多相关《C语言多项式运算.docx(14页珍藏版)》请在冰豆网上搜索。
![C语言多项式运算.docx](https://file1.bdocx.com/fileroot1/2023-2/1/ad9a31f3-9018-4ebd-8f68-0a2fde2e28b1/ad9a31f3-9018-4ebd-8f68-0a2fde2e28b11.gif)
C语言多项式运算
#include
#include
#include
typedefstructPolyNode
{
floatcoef;//系数
intexpn;//指数
structPolyNode*next;
}LNode,*LinkList;
LNode*MakeNode(floatcoef,intexpn){
LNode*p;
p=(LNode*)malloc(sizeof(LNode));
p->coef=coef;p->expn=expn;p->next=NULL;
returnp;
}
voidInitList(LinkList&L){
L=MakeNode(0,-1);
return;
}
voidPrintPolyn(LinkListL){
LNode*p;
if(!
L)
printf("NULL\n");
elseif(L->next==NULL)
printf("0\n");
else{
p=L->next;
while(p){
printf("%gX^%d",p->coef,p->expn);
p=p->next;
if(p&&p->coef>0)printf("+");
}
printf("\n");
}
}
voidOrderInsert(LinkListL,LNode*s){
LNode*p,*q;
p=L;
while(p->next&&p->next->expnexpn)p=p->next;
if(p->next&&p->next->expn==s->expn){
p->next->coef+=s->coef;
if(p->next->coef==0){
q=p->next;
p->next=q->next;
free(q);
}
free(s);
}
else{
s->next=p->next;
p->next=s;
}
}
LinkListcreatlist(void){
LinkListhead;
LNode*p;
floatc;inte;
InitList(head);
printf("输入系数指数,系数为0时结束:
");
while
(1){
scanf("%f",&c);
if(c==0)break;
scanf("%d",&e);
p=MakeNode(c,e);
OrderInsert(head,p);
}
returnhead;
}
voidDestroyPolyn(LinkList&L){
LNode*p=L,*q;
while(p){
q=p->next;
free(p);p=q;
}
L=NULL;
}
voidClearPolyn(LinkList&L){
LNode*p,*q;
if(L==NULL)return;
p=L->next;L->next=NULL;
while(p){
q=p->next;
free(p);p=q;
}
}
voidCopyPolyn(LinkListLa,LinkList&Lb){
LNode*p,*r;
if(!
La)return;
InitList(Lb);
r=Lb;
p=La->next;
while(p){
r->next=MakeNode(p->coef,p->expn);
r=r->next;
p=p->next;
}
r->next=NULL;
}
voidAddPolyn(LinkListLa,LinkListLb,LinkList&Lc){
LNode*p,*q,*r;
InitList(Lc);
if(!
Lc)return;
p=La->next;
q=Lb->next;
r=Lc;
while(p!
=NULL&&q!
=NULL){
r->next=(LNode*)malloc(sizeof(LNode));
if(p->expn==q->expn){
r->next->coef=p->coef+q->coef;
r->next->expn=p->expn;
r=r->next;
p=p->next;
q=q->next;
}
elseif(p->expn>q->expn){
r->next->coef=q->coef;
r->next->expn=q->expn;
q=q->next;
r=r->next;
}
else{
r->next->coef=p->coef;
r->next->expn=p->expn;
p=p->next;
r=r->next;}
}
if(q==NULL){
while(p!
=NULL){
printf("4\n");
r->next=(LNode*)malloc(sizeof(LNode));
r->next->coef=p->coef;
r->next->expn=p->expn;
r=r->next;
p=p->next;
}
}
if(p==NULL){
while(q!
=NULL){
printf("5\n");
r->next=(LNode*)malloc(sizeof(LNode));
r->next->coef=q->coef;
r->next->expn=q->expn;
r=r->next;
q=q->next;
}
}
r->next=NULL;
}
voidSubPolyn(LinkListLa,LinkListLb,LinkList&Lc){
LNode*p,*q,*r,*h;
floatmin;
InitList(Lc);
if(!
Lc)return;
p=La->next;
q=Lb->next;
r=Lc;
while(p!
=NULL&&q!
=NULL){
r->next=(LNode*)malloc(sizeof(LNode));
if(p->expn==q->expn){
min=p->coef-q->coef;
if(min!
=0){
r->next->coef=min;
r->next->expn=p->expn;
r=r->next;
p=p->next;
q=q->next;
}
else{
h=r->next;
free(h);
p=p->next;
q=q->next;
}
}
elseif(p->expn>q->expn){
printf("2\n");
r->next->coef=-q->coef;
r->next->expn=q->expn;
q=q->next;
r=r->next;
}
else{
printf("3\n");
r->next->coef=p->coef;
r->next->expn=p->expn;
p=p->next;
r=r->next;}
}
if(q==NULL){
while(p!
=NULL){
printf("4\n");
r->next=(LNode*)malloc(sizeof(LNode));
r->next->coef=p->coef;
r->next->expn=p->expn;
r=r->next;
p=p->next;
}
}
if(p==NULL){
while(q!
=NULL){
r->next=(LNode*)malloc(sizeof(LNode));
r->next->coef=-q->coef;
r->next->expn=q->expn;
r=r->next;
q=q->next;
}
}
r->next=NULL;
}
doubleSumPolyn(LinkListLa,double&x){
doubleSum=0;
if(!
La)printf("error");
LNode*p;
p=La->next;
while(p){
Sum+=p->coef*pow(x,p->expn);
p=p->next;
}
returnSum;
}
voidDaoShuPolyn(LinkListLa,LinkList&Lb,int&x){
LNode*p,*q,*k;
inti;
CopyPolyn(La,Lb);
if(!
La||!
Lb)printf("error");
p=La;
q=Lb;
for(i=0;iwhile(q){
if(q->next&&q->next->expn>0){
q->next->coef=q->next->coef*q->next->expn;
q->next->expn=q->next->expn-1;
q=q->next;
}
else{
if(q->next&&q->next->expn==0)
{
k=q->next;
q->next=k->next;
free(k);
}
elseq=q->next;
}
}
q=Lb;
}
}
voidJifenPolyn(LinkListLa,LinkList&Lb,int&x){
LNode*p,*q;
inti;
CopyPolyn(La,Lb);
if(!
La||!
Lb)printf("error");
p=La;
q=Lb;
for(i=0;iwhile(q->next){
q->next->expn=q->next->expn+1;
q->next->coef=q->next->coef/q->next->expn;
q=q->next;
}
q=Lb;
}
}
doubleDingJifenPolyn(LinkListLa,int&w,double&a,double&b){
LinkListLb;
doubleA;
JifenPolyn(La,Lb,w);
A=SumPolyn(Lb,a)-SumPolyn(Lb,b);
returnA;
}
voidMulityPolyn(LinkListLa,LinkListLb,LinkList&Lc){
LNode*p,*q,*r;
LinkListLr;
InitList(Lr);
InitList(Lc);
r=Lr;
p=La;
q=Lb;
if(!
La||!
Lb||!
Lc)printf("error");
while(p->next){
while(q->next){
r=(LNode*)malloc(sizeof(LNode));
r->coef=p->next->coef*q->next->coef;
r->expn=p->next->expn+q->next->expn;
OrderInsert(Lc,r);
q=q->next;
}
p=p->next;
q=Lb;
}
}
voidPowPolyn(LinkListLa,LinkList&Lb,intv){
CopyPolyn(La,Lb);
inti=0;
for(i=0;iMulityPolyn(La,Lb,Lb);
}
}
#defineN15
voidmain(){
LinkListP[N]={NULL};
inti,j,k,menu;
while
(1){
printf("\n");
printf("0--Exit\n");
printf("1--Create\n");
printf("2--Print\n");
printf("3--Copy\n");
printf("4--Add\n");
printf("5--Sub\n");
printf("6--Destroy\n");
printf("7--Clear\n");
printf("8--Sum\n");
printf("9--DaoShu\n");
printf("10--Mulity\n");
printf("11--Jifen\n");
printf("12--DingJifen\n");
printf("13--Pow\n");
printf("\nPleaseChoose:
");
scanf("%d",&menu);
switch(menu){
case0:
return;
case1:
printf("输入新多项式的下标(0--%d):
",N-1);
scanf("%d",&i);
P[i]=creatlist();
break;
case2:
for(i=0;iprintf("P[%d]=",i);
PrintPolyn(P[i]);
}
break;
case3:
printf("输入被复制的多项式和新多项式的下标(0--%d):
",N-1);
scanf("%d%d",&i,&j);
CopyPolyn(P[i],P[j]);
break;
case4:
printf("输入两相加的多项式的和生成多项式的下标(0--%d)",N-1);
scanf("%d%d%d",&i,&j,&k);
AddPolyn(P[i],P[j],P[k]);
break;
case5:
printf("输入两相减的多项式和生成多项式的下标(0--%d)",N-1);
scanf("%d%d%d",&i,&j,&k);
SubPolyn(P[i],P[j],P[k]);
break;
case6:
printf("输入被销毁多项式的下标(0--%d):
",N-1);
scanf("%d",&i);
DestroyPolyn(P[i]);
break;
case7:
printf("输入被清空多项式的下标(0--%d):
",N-1);
scanf("%d",&i);
ClearPolyn(P[i]);
break;
case8:
doubleSum,x;
printf("输入要求多项式的下标(0--%d)和x的值",N-1);
scanf("%d%lf",&i,&x);
Sum=SumPolyn(P[i],x);
printf("Sum=%lf",Sum);
break;
case9:
inty;
printf("输入要求导的多项式下标和求导后多项式下标(0--%d)以及求导次数y\n",N-1);
scanf("%d%d%d",&i,&j,&y);
DaoShuPolyn(P[i],P[j],y);
break;
case10:
printf("输入两个相乘多项式的下标和生成多项式的下标(0--%d)",N-1);
scanf("%d%d%d",&i,&j,&k);
MulityPolyn(P[i],P[j],P[k]);
break;
case11:
intz;
printf("输入要积分的多项式下标和积分后的多项式下标(0--%d)以及积分的次数z\n",N-1);
scanf("%d%d%d",&i,&j,&z);
JifenPolyn(P[i],P[j],z);
break;
case12:
intw;
doublea,b,S;
printf("输入要积分的多项式下标(0--%d)以及积分的次数w,以及上下限a,b\n",N-1);
scanf("%d%d%lf%lf",&i,&w,&a,&b);
S=DingJifenPolyn(P[i],w,a,b);
printf("积分后的值S=%lf",S);
break;
case13:
intv;
printf("输入要乘方的多项式下标和乘方后的多项式下标(0--%d)以及乘方次数v\n",N-1);
scanf("%d%d%d",&i,&j,&v);
PowPolyn(P[i],P[j],v);
break;
default:
;
}
}
}