一元多项式的各种运算实现(c++c)_第1页
一元多项式的各种运算实现(c++c)_第2页
一元多项式的各种运算实现(c++c)_第3页
一元多项式的各种运算实现(c++c)_第4页
一元多项式的各种运算实现(c++c)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一元多项式各种运算本程序可完成一元多项式的加,减,乘,积分,微分运算输入可按习惯书写形式输入各项,输出按指数降序/头文件 :#include#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef int status; typedef float ty

2、pe; typedef int fuhaosign;结构体类型定义:typedef struct listtype data; int zhi; struct list* next;list;typedef struct nodeint length; list* next;node;用到的函数:注:各函数参数如是结构体指针,则此指针传入函数之前必将其赋值为NULL否则可能出现错误。void shuoming()cout*endl;cout*各项可以用平时书写习惯输入,若有未知数,必须用x表示,且各项之间必须用空格分隔,支*endl;cout*持:系数是小数,指数是负数的情况,但指数不能是小数

3、,功能选择项: *endl;cout* 1:加法;2:减法;3:乘法;4:积分;5:微分;6:求值;7:原样输出多项式 *endl;cout*endl;cout举例:3 x3 9.3x-3 -x.endl;/求未知数指数是-k时的值float fumi(int k) float a=1.0; for(int i=1;inext) init(toup);/保证赋值前链表有且仅有一个头结点/初始化各变量char c,ch= ;/c接受字符,ch记录上一字符,用于检错int k2=0;/k2标志着+-号前面是否有数值,0时没有,1为有fuhaosign k1=1;/k1是符号位正负的标志,0为负,1

4、为正int k3=0;/小数点的个数int kx=0;/标志前面是否有xlist* p=toup-next,* t;type dat=0.0;/输入c=getchar();int i=0;while(c!=n)if(!p) p=(list*)malloc(sizeof(list); if(!p) cout溢出错误next=p;toup-length+;i+;p-next=NULL;t=p; else t-next=p;t=p;p-next=NULL;toup-length+;if(ch=+|ch=-)&(c=+|c=-)cout未按说明输入,请下次输入前仔细阅读data=k1*1; else

5、p-data=k1*dat;dat=0.0;k1=1;k2=0;k3=0;kx=1;break; case .:k3=1;break; case :if(k2=1) if(kx=1) p-zhi=k1*(int)dat;dat=0.0;p=p-next;else p-data=k1*dat;p-zhi=0;dat=0.0;p=p-next; else if(1=kx) p-zhi=1;p=p-next;k1=1;k2=0;k3=0;kx=0;break; default:if(!k3) dat=c-48+10*dat;/k3=0,即前面没有小数点时 else dat=dat+(c-48)*fu

6、mi(k3);k3+; k2=1;/ switchc=getchar();/ whileif(ch=+|ch=-|ch=.) coutdata =k1*dat;p-zhi=0;else if(k2=0) p-zhi=k1*1;else p-zhi=k1*(int)dat;/初始化,生成单链表表头,参数是指向头结点的指针void init(node *&toup)status destory(node *&toup); if(toup) destory(toup);/假如有头结点或元素节点,销毁结点 toup=(node*)malloc(sizeof(node); if(!toup)cout溢出

7、错误length=0; toup-next=NULL;/销毁全部,包括头结点status destory(node *&toup)if(toup)list* p=toup-next;list* t; while(p) t=p-next; free(p); p=t;/while free(toup);toup=NULL;/if return OK;/找到指数与m相等的元素,返回前一元素的指针,参数是元素指针status equalmi(list *&element,int m,list *&prep)prep=element; list *t=element-next;while(t&t-zhi

8、!=m)prep=t;t=t-next;/while if(t) return 1;/找到了 else return 0;/将toup2原样赋给toup1void copy(node*& toup1,node*& toup2)if(!toup2) cout初始化未成功next,*t1=toup1-next ;while(t2)list* temp=(list*)malloc(sizeof(list);if(!t1)toup1-next =temp;toup1-length+;temp-data =t2-data ;temp-zhi =t2-zhi ;t2=t2-next ;t1=temp;el

9、set1-next =temp;toup1-length+;temp-data =t2-data ;temp-zhi =t2-zhi ;t2=t2-next ;t1=temp;if(t1) t1-next=NULL;/按指数绝对值从小到大存放,交换元素值法void paixu(node *&toup)if(!toup) cout初始化失败next; int i=1; while(ilength)list* temp=a; list* p=a; list* t=p-next; while(t) if(abs(p-zhi)abs(t-zhi) p=t;t=t-next; else t=t-next

10、; /while a=a-next; if(p!=temp) float temp1=temp-data;int temp2=temp-zhi;temp-data=p-data;temp-zhi=p-zhi;p-data=temp1;p-zhi=temp2; i+;/while/把指数相等的项合并,也可实现多项式加法void neat(node *&toup) paixu(toup);/先排序 list* p=toup-next; list* pre; while(p) if(equalmi(p,p-zhi,pre)p-data=pre-next-data+p-data; list *temp

11、=pre-next; pre-next=pre-next-next; free(temp); toup-length-;/if else p=p-next;/while,合并幂相等的项 p=toup-next;list* pr=NULL; list* tem=NULL;while(p)if(p-data =0)if(!pr)tem=p;toup-next =p-next ;p=p-next ;toup-length-; free(tem);tem=NULL;elsetem=p;pr-next=p-next ;toup-length -;p=p-next;free(tem);tem=NULL;/

12、ifelsepr=p;p=p-next ;/else/while,将数据为0的项删除pr=NULL;/得到第i个元素的指数/*status get(node *&toup,int i)if(!toup) cout错误:没有头结点endl;exit(-1);if(i(int)toup-data)cout错误:i=0或i大于元素个数0;i-) t=t-next;return (t-zhi);*/把两个多项式连接起来,用newtoup返回void concat(node*& atoup,node*& btoup,node*& newtoup)if(!atoup|!btoup) coutnext;li

13、st* bp=btoup-next;list* temp=NULL;int i=1;while(ap) list* t=(list*)malloc(sizeof(list);if(i=1) newtoup-next=t;newtoup-length+;t-data=ap-data;t-zhi=ap-zhi;ap=ap-next;temp=t;i+;else temp-next=t;newtoup-length+;t-data=ap-data;t-zhi=ap-zhi;temp=t;ap=ap-next; while(bp) list* t=(list*)malloc(sizeof(list);

14、 if(temp) temp-next=t;else temp=t;newtoup-length+;t-data=bp-data;t-zhi=bp-zhi;bp=bp-next;temp=t;if(temp) temp-next=NULL;/链表toup中每个节点的数据域,正变负,负变正,赋给newtoup,toup中的数据不变void qufan(node*& toup,node*& newtoup)if(!toup) cout未初始化,请重新运行。next ;list* newt=NULL;while(t)list* temp=(list*)malloc(sizeof(list);if(!

15、newt)newtoup-next =temp;newtoup-length+;temp-data =t-data *(-1);temp-zhi=t-zhi;newt=temp;elsenewt-next =temp;newtoup-length +;temp-data =t-data *(-1);temp-zhi=t-zhi;newt=temp;t=t-next ;/whileif(newt) newt-next =NULL;/输入x值,计算多项式的值void qiuzhi(node *&toup,node*& resulttoup)init(toup); init(resulttoup);

16、 cout输入各项:endl;couty=next; int x0;cout请输入x的值:x0; float sum=0.0,x1; int x=1,i=1; while(p) for(;izhi);i+) x=x*x0; if(p-zhi0) x1=x; else if(p-zhi=0) x1=1; else x1=(float)1/x; sum=sum+(p-data)*x1; p=p-next; /while list* temp=(list*)malloc(sizeof(list); resulttoup-next=temp; resulttoup-length+; temp-data

17、=sum; temp-zhi =0; temp-next =NULL; neat(resulttoup); /两个多项式相加,toup1+toup2,resulttoup返回void jia(node *&toup1,node*& toup2,node*& resulttoup)init(toup1);init(toup2); cout输入各项:endl;couty1=endl;fuzhi(toup1); couty2=endl;fuzhi(toup2);concat(toup1,toup2,resulttoup);neat(resulttoup);/两个多项式相减,toup1-toup2,r

18、esulttoup返回void jian(node *&toup1,node*& toup2,node*& resulttoup) init(toup1);init(toup2); cout输入各项:endl;couty1=endl;fuzhi(toup1); couty2=endl;fuzhi(toup2);node* fantoup=NULL;qufan(toup2,fantoup);concat(toup1,fantoup,resulttoup);neat(resulttoup);/两个多项式相乘void cheng(node*& atoup,node*& btoup,node*& re

19、sulttoup)init(atoup);init(btoup);init(resulttoup); cout输入各项:endl;couty1=endl;fuzhi(atoup); couty2=next ,*t=NULL; list* b=btoup-next;if(!a)copy(resulttoup,btoup);else if(!b)copy(resulttoup,atoup);elsewhile(a) b=btoup-next;while(b)list* temp=(list*)malloc(sizeof(list);if(!t)t=temp;resulttoup-next =tem

20、p;resulttoup-length +;elset-next =temp;resulttoup-length +;t=temp;t-data =a-data *b-data ;t-zhi =a-zhi +b-zhi ;b=b-next ;/while(b)a=a-next ;/while(a) t-next =NULL;/elseneat(resulttoup);/求积分void jifen(node*& toup,node*& resulttoup)init(toup); init(resulttoup); cout输入各项:endl;couty=next ,*t=NULL;while(

21、p)list* temp=(list*)malloc(sizeof(list);if(!resulttoup-next )resulttoup-next =temp;resulttoup-length +;t=temp;t-next =NULL;elset-next =temp;resulttoup-length +;t=temp;t-next =NULL;if(p-zhi =-1)t-zhi =p-zhi; t-data =p-data;elset-zhi =p-zhi +1; t-data =p-data /t-zhi;p=p-next ;/whileneat(resulttoup);/微

22、分void weifen(node*& toup,node*& resulttoup)init(toup); init(resulttoup); cout输入各项:endl;couty=next,* p=NULL;while(t)list* temp=(list*)malloc(sizeof(list);if(!resulttoup-next )resulttoup-next =temp;resulttoup-length +;p=temp;p-next =NULL;elsep-next =temp;resulttoup-length +;p=temp;p-next =NULL;p-data

23、=t-data *(t-zhi );p-zhi =t-zhi -1;t=t-next ;neat(resulttoup);/按指数从大到小存放status outxu(node*& toup,node*& newtoup)if(!toup) cout初始化失败next) return 1;copy(newtoup,toup); list *p=newtoup-next; while(p-next ) list* t=p; list* hou=p-next; while(hou) if(t-zhizhi) t=hou; hou=hou-next; /while list* temp=(list*

24、)malloc(sizeof(list);if(t!=p)float temp1=t-data;int temp2=t-zhi;t-data=p-data;t-zhi=p-zhi;p-data=temp1;p-zhi=temp2; p=p-next; /whilereturn 1;/输出多项式status out(node*& toup)extern yunsuan;if(!toup) cout要输出的链表未初始化,请重新运行endl;exit(-1); node* outresult=NULL;outxu(toup,outresult);cout结果是:next;int i=1; couts

25、etprecision(3);if(!temp)if(yunsuan=4)cout任意常数endl;elsecout0zhi)case 0:if(1=i) coutdata;i+; /if else if(temp-data=0) cout+data; else coutdata ; /else break;case 1:if(1=i) if(temp-data0) if(1=temp-data ) coutx; else coutdata data ) cout-x; else coutdata data 0) if(1=temp-data) cout+x; else cout+data d

26、ata ) cout-x; else coutdata data 0)if(1=temp-data ) coutxzhi ;else coutdata xzhi ;elseif(-1=temp-data ) cout-xzhi ;else coutdata xzhi ;i+;/if elseif(temp-data 0)if(1=temp-data ) cout+xzhi ;else cout+data xzhi;elseif(-1=temp-data ) cout-xzhi ;else coutdata xzhi ;/else/switchtemp=temp-next ;/while if(yunsuan=4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论