首页 多项式的运算(c语言实现)

多项式的运算(c语言实现)

举报
开通vip

多项式的运算(c语言实现)#include"stdio.h" #include"stdlib.h" #include"conio.h" typedef struct Item{ double coef;//系数 int expn;//指数 struct Item *next; }Item,*Polyn; #define CreateItem(p) p=(Item *)malloc(sizeof(Item)); #define DeleteItem(p) free((void *)p); /***************...

多项式的运算(c语言实现)
#include"stdio.h" #include"stdlib.h" #include"conio.h" typedef struct Item{ double coef;//系数 int expn;//指数 struct Item *next; }Item,*Polyn; #define CreateItem(p) p=(Item *)malloc(sizeof(Item)); #define DeleteItem(p) free((void *)p); /************************************************************/ /* 判断选择函数 */ /************************************************************/ int Select(char *str) { char ch; printf("%s\n",str); printf("Input Y or N:"); do{ ch=getch(); }while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n'); printf("\n"); if(ch=='Y'||ch=='y') return(1); else return(0); } /************************************************************/ /* 插入位置定位函数 */ /**************************************************************/ int InsertLocate(Polyn h,int expn,Item **p) { Item *pre,*q; pre=h; q=h->next; while(q&&q->expnnext; } if(!q) { *p=pre; return(1); } else if(q->expn==expn) { *p=q; return(0); } else { *p=pre; return(-1); } } /************************************************************/ /* 插入结点函数 */ /************************************************************/ void insert(Item *pre,Item *p) { p->next=pre->next; pre->next=p; } /************************************************************/ /* 输入多项式 */ /************************************************************/ Polyn Input(void) { double coef; int expn,flag; Item *h,*p,*q,*pp; CreateItem(h);//产生头结点 h->next=NULL; printf("input coef and expn(if end ,expn=-1)\n"); while(1) { scanf("%lf%d",&coef,&expn); //输入多项式的系数和指数if(expn==-1) break; //若指数为-, 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示输入结束 if(InsertLocate(h,expn,&pp))//返回值非表示插入新结点 { CreateItem(p); p->coef=coef; p->expn=expn; insert(pp,p); } else if(Select("has the same expn,Replace older value?")) pp->coef=coef; //指数相同,替换系数 } return h; } /************************************************************/ /* 撤消多项式 */ /************************************************************/ void Destroy(Polyn h) { Item *p=h,*q; while(p!=NULL) { q=p; p=p->next; DeleteItem(q); } } /************************************************************/ /* 输出多项式 */ /************************************************************/ void Output(Polyn h,char *title) { int flag=1; Item *p=h->next; printf("%s=",title); while(p) { if(flag) //表示是否是多项式的第一项 { flag=0; if(p->expn==0) printf("%.2lf",p->coef); else printf("%.2lfx^%d",p->coef,p->expn); } else { if(p->coef>0) printf("+"); if(p->expn==0) printf("%.2lf",p->coef); else printf("%.2lfx^%d",p->coef,p->expn); } p=p->next; } printf("\n"); } /************************************************************/ /* 判断两个多项式项的关系 */ /************************************************************/ int ItemComp(Item x,Item y) { if(x.expnnext,*pb=h2->next,*s; CreateItem(head); head->next=NULL; last=head; while(pa&&pb){ CreateItem(s); last->next=s; last=s; switch (ItemComp(*pa,*pb)) { case -1:last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;break; case 0:last->coef=pa->coef+pb->coef;last->expn=pa->expn;pa=pa->next;pb=pb->next;break; case 1:last->coef=pb->coef;last->expn=pb->expn;pb=pb->next;break; } } if(pa){while(pa){/*把剩余节点插入*/ CreateItem(s);last->next=s;last=s;last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;}} if(pb){while(pb){/*把剩余节点插入*/ CreateItem(s);last->next=s;last=s;last->coef=pb->coef;last->expn=pb->expn;pb=pb->next;}} last->next=NULL; return head; } /************************************************************/ /* 两多项式多项式相减 */ /************************************************************/ Polyn SubtractPolyn(Polyn h1,Polyn h2) { Item *head,*last,*pa=h1->next,*pb=h2->next,*s; CreateItem(head); head->next=NULL; last=head; while(pa&&pb){ CreateItem(s); last->next=s; last=s; switch (ItemComp(*pa,*pb)) { case -1:last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;break; case 0:last->coef=pa->coef-pb->coef;last->expn=pa->expn;pa=pa->next;pb=pb->next;break; case 1:last->coef=-(pb->coef);last->expn=pb->expn;pb=pb->next;break; } } if(pa){while(pa){/*把剩余节点插入*/ CreateItem(s);last->next=s;last=s;last->coef=pa->coef;last->expn=pa->expn;pa=pa->next;}} if(pb){while(pb){/*把剩余节点插入*/ CreateItem(s);last->next=s;last=s;last->coef=-(pb->coef);last->expn=pb->expn;pb=pb->next;}} last->next=NULL; return head; } /************************************************************/ /* 两多项式多项式相乘 */ /************************************************************/ Polyn MultPolyn(Polyn h1,Polyn h2) //两个多项式相乘 { int item,expn; Item *head,*pa,*pb=h2->next,*s,*pp; double coef; CreateItem(head); head->next=NULL; while(pb){ pa=h1->next; while(pa){ expn=pa->expn+pb->expn; coef=pa->coef*pb->coef; if(InsertLocate(head,expn,&pp)) { CreateItem(s); s->coef=coef; s->expn=expn; insert(pp,s); } else pp->coef=pp->coef+pa->coef; pa=pa->next; } pb=pb->next; } return head; } /************************************************************/ /* 菜单选择 */ /************************************************************/ int menu(void) { int num; system("cls"); printf("%20c1--create P(x)\n",' '); printf("%20c2--create Q(x)\n",' '); printf("%20c3--p(x)+Q(x)\n",' '); printf("%20c4--P(x)-Q(x)\n",' '); printf("%20c5--p(x)*Q(x)\n",' '); printf("%20c6--print P(x)\n",' '); printf("%20c7--print Q(x)\n",' '); printf("%20c8--print P(x)+Q(x)\n",' '); printf("%20c9--print P(x)-Q(x)\n",' '); printf("%20c10--print P(x)*Q(x)\n",' '); printf("%20c11--Quit\n",' '); printf(" please select 1,2,3,4,5,6,7,8,9,10,11:"); do{ scanf("%d",&num); }while(num<1 || num>11); return(num); } /************************************************************/ /* 判断多项式是否存在 */ /************************************************************/ int PolynNotEmpty(Polyn h,char *p) { if(h==NULL) { printf("%s is not exist!\n",p); getchar(); return(0); } else return(1); } /************************************************************/ /* 主函数 */ /************************************************************/ void main() { int num; Polyn h1=NULL; //指向p(x) 指针 Polyn h2=NULL; //指向Q(x) 指针 Polyn h3=NULL; //指向P(x)+Q(x) 指针 Polyn h4=NULL; //指向P(x)-Q(x) 指针 Polyn h5=NULL; //指向P(x)*Q(x) 指针 while(1) { num=menu(); getchar(); switch(num) { case 1: //输入第一个多项式,若多项式存在,首先撤消然后再输入if(h1!=NULL) { if(Select("P(x) is not Empty,Create P(x) again?")) { Destroy(h1); h1=Input(); } } else h1=Input(); break; case 2: //输入第二个多项式,若多项式存在,首先撤消然后再输入if(h2!=NULL) { if(Select("Q(x) is not Empty,Create Q(x) again?")) { Destroy(h2); h2=Input(); } } else h2=Input(); break; case 3: //两多项式相加 if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)"))//判断俩多项式都非空 {h3=AddPolyn(h1,h2); Output(h3,"P(x)+Q(X)"); printf("P(x)+Q(x) has finished!\n"); getchar(); } break; case 4: //两多项式相减 if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)")) { h4=SubtractPolyn(h1,h2); Output(h4,"P(x)-Q(x)"); printf("P(x)-Q(x) has finished!\n"); getchar(); } break; case 5: //两多项式相乘 if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)")) { h5=MultPolyn(h1,h2); Output(h5,"P(x)*Q(x)"); printf("P(x)*Q(x) has finished!\n"); getchar(); } break; case 6: //显示第一个多项式 if(PolynNotEmpty(h1,"p(x)")) { Output(h1,"P(x)"); getchar(); } break; case 7: //显示第二个多项式 if(PolynNotEmpty(h2,"Q(x)")) { Output(h2,"Q(x)"); getchar(); } break; case 8: //显示相加结果多项式 if(PolynNotEmpty(h3,"P(x)+Q(x)")) { Output(h3,"P(x)+Q(x)"); getchar(); } break; case 9: //显示相减结果多项式 if(PolynNotEmpty(h4,"P(x)-Q(x)")) { Output(h4,"P(x)-Q(x)"); getchar(); } break; case 10: //显示相乘结果多项式 if(PolynNotEmpty(h5,"P(x)*Q(x)")) { Output(h5,"P(x)*Q(x)"); getchar(); } break; case 11: //结束程序运行。结束前应先撤消已存在的多项式if(h1!=NULL) Destroy(h1); if(h2!=NULL) Destroy(h2); if(h3!=NULL) Destroy(h3); if(h4!=NULL) Destroy(h4); if(h5!=NULL) Destroy(h5); } if(num==11) break; } getch(); }
本文档为【多项式的运算(c语言实现)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_562397
暂无简介~
格式:doc
大小:41KB
软件:Word
页数:0
分类:互联网
上传时间:2019-07-17
浏览量:16