C语言多项式运算.docx
- 文档编号:8635081
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:16.37KB
C语言多项式运算.docx
《C语言多项式运算.docx》由会员分享,可在线阅读,更多相关《C语言多项式运算.docx(14页珍藏版)》请在冰豆网上搜索。
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->expn
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;i while(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;i while(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;i MulityPolyn(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;i printf("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: ; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 多项式 运算