一元多项式计算

上传人:痛*** 文档编号:105162192 上传时间:2022-06-11 格式:DOC 页数:9 大小:79.50KB
收藏 版权申诉 举报 下载
一元多项式计算_第1页
第1页 / 共9页
一元多项式计算_第2页
第2页 / 共9页
一元多项式计算_第3页
第3页 / 共9页
资源描述:

《一元多项式计算》由会员分享,可在线阅读,更多相关《一元多项式计算(9页珍藏版)》请在装配图网上搜索。

1、 . . . . 数据结构课实验实验报告实验1一元多项式计算姓名_晓伟_学号_13030311_班级_13软二_完成时间_2014/11/17_实验1 一元多项式计算1 问题描述: 能够按照指数降序排列建立并输出多项式; 完成两个多项式的相加、相减和相乘,并将结果输出。参考教材P42页上的例2-4定义抽象数据类型,实现多项式的创建、相加、相减、相乘、打印等函数。可以采用链表或数组任意一种结构表示多项式。2 设计思想数学模型的选择在数学上,一个一元多项式Pn(x)可按升幂写成:Pn(x)=a 0+a1 x+a2 x2 +an xn-1 .它由n+1个系数惟一确定,因此,在计算机里,它可用一个线性

2、表P来表示:Pn=(a0,a1,a2,an)每一项的指数i隐含在其系数ai的序号里。 多项式的乘法规那么:屡次运用单项式与多项式相乘的法那么得到的计算时(a+b)(m+n),先把(m+n)看成一个单项式,(a+b) 是一个多项式,运用单项式与多项式相乘的法那么,得到(a+b)(m+n)=a(m+n)+b(m+n),然后再次运用单项式与多项式相乘的法那么。3 数据结构定义typedef struct Polynomiafloat coef;int expn;struct Polynomial *next;*Polyn,Polynomial;4 系统功能模块介绍系统主要分为:(1 )compare

3、();(2 )insert()(3 )createpolyn()(4 )printpolyn()(5 )addpolyn()(6 )subtractpolyn()(7 )mulpolyn()(8) main()5 程序清单打印清单# include stdio.h# include malloc.htypedef struct Polynomialfloat coef;int expn;struct Polynomial *next;*Polyn,Polynomial;/int compare(Polyn a,Polyn b) if(a&b) if(!b|a-expnb-expn) retur

4、n 1; else if(!a|a-expnexpn)return -1; else return 0; else if(!a&b)return -1;/a多项式已空,但b多项式非空elsereturn 1;/b多项式已空,但a多项式非空/compare /void Insert(Polyn p,Polyn h) if(p-coef=0) free(p); /系数为0的话释放结点else /如果系数不为0 Polyn q1,q2; q1=h;q2=h-next; while(q2&p-expnexpn) /查找插入位置q1=q2; q2=q2-next; if(q2&p-expn=q2-exp

5、n) /将指数一样相合并q2-coef+=p-coef; free(p); if(!q2-coef) /系数为0的话释放结点q1-next=q2-next; free(q2); else /指数为新时将结点插入p-next=q2; q1-next=p; /Insert /Polyn CreatePolyn(Polyn head) Polyn p; /定义一个p链表p=head=(Polyn)malloc(sizeof(struct Polynomial); head-next=NULL; p=(Polyn)malloc(sizeof(struct Polynomial);/建立新结点以接收数据

6、scanf(%f %d,&p-coef,&p-expn); while(p-coef!=-100) Insert(p,head); /调用Insert函数插入结点p=(Polyn)malloc(sizeof(struct Polynomial); /建立新结点以接收数据scanf(%f%d,&p-coef,&p-expn); printf(建立成功!nn);return head; /CreatePolyn /void PrintPolyn(Polyn P) Polyn q=P-next; int flag=1; /项数计数器if(!q) /假设多项式为空,输出0 putchar(0); pr

7、intf(n); return; while (q) if(q-coef0&flag!=1) putchar(+); /系数大于0且不是第一项if(q-coef!=1&q-coef!=-1) /系数非1或-1的普通情况printf(%g,q-coef); if(q-expn=1)putchar(X); else if(q-expn) printf(X%d,q-expn); else if(q-coef=1) if(!q-expn)putchar(1); else if(q-expn=1) putchar(X); else printf(X%d,q-expn); if(q-coef=-1) if

8、(!q-expn) printf(-1); else if(q-expn=1)printf(-X); else printf(-X%d,q-expn); q=q-next; flag+; /while printf(n); /PrintPolyn /Polyn AddPolyn(Polyn pa,Polyn pb) /求解并建立多项式a+b,返回其头指针Polyn qa=pa-next; Polyn qb=pb-next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial); /建立头结点hc-next=NULL; hea

9、dc=hc; while(qa|qb) qc=(Polyn)malloc(sizeof(struct Polynomial); switch(compare(qa,qb) case 1: qc-coef=qa-coef; qc-expn=qa-expn; qa=qa-next; / 当a-expn b-expn时,将a这个节点放进新的多项式hc中break; case 0: qc-coef=qa-coef+qb-coef; qc-expn=qa-expn; qa=qa-next; qb=qb-next; break; / 当a-expn=b-expn时,先把系数相加,指数不变,在将这个节点放进

10、新的多项式hc中 case -1: qc-coef=qb-coef; qc-expn=qb-expn; qb=qb-next; break; / 当a-expn expn时,将b这个节点放进新的多项式hc中 /switch if(qc-coef!=0) qc-next=hc-next; hc-next=qc; hc=qc; else free(qc); /当相加系数为0时,释放该结点 /while return headc; /AddPolyn /Polyn SubtractPolyn(Polyn pa,Polyn pb) /求解并建立多项式a-b,返回其头指针Polyn h=pb; Poly

11、n p=pb-next; Polyn pd; while(p) /将pb的系数取反p-coef*=-1; p=p-next; pd=AddPolyn(pa,h); for(p=h-next;p;p=p-next) /恢复pb的系数p-coef*=-1; return pd; /SubtractPolyn /Polyn MulPolyn(Polyn pa,Polyn pb) /求解并建立多项式a*b,返回其头指针(该函数实现乘法) Polyn hf,pf; Polyn qa=pa-next; Polyn qb=pb-next; hf=(Polyn)malloc(sizeof(struct Pol

12、ynomial); /建立头结点hf-next=NULL; for(;qa;qa=qa-next) for(qb=pb-next;qb;qb=qb-next) pf=(Polyn)malloc(sizeof(struct Polynomial); pf-coef=qa-coef*qb-coef; pf-expn=qa-expn+qb-expn; Insert(pf,hf); /调用Insert函数以合并指数一样的项 return hf; /MulPolyn /int main() Polyn pa=0,pb=0,pc,pd,pf;/定义各式的头指针,pa与pb在使用前付初值NULL /pc头指

13、针所在的多项式用在加法中作为结果,pd用在加法中,pf乘法中int i=1; /菜单变量printf(建立第一个多项式,输入-100完毕:n);pa=CreatePolyn(pa); /建立第一个多项式a printf(n);printf(建立第二个多项式,输入-100完毕:n);pb=CreatePolyn(pb);printf(n); /建立第二个多项式b printf(多项式A(x)=); /多项式aPrintPolyn(pa);printf(多项式B(x)=); /多项式bPrintPolyn(pb);while(i!=0)printf(=n);printf( 选择计算公式:n);pr

14、intf( 1:A(x)+B(x)n);printf( 2:A(x)-B(x)n);printf( 3:A(x)*B(x)n);printf( 0:退出程序!n);printf(=n);scanf(%d,&i);switch (i) case 1 : pc=AddPolyn(pa,pb); printf(多项式A(x)+B(x)=); /多项式a+b PrintPolyn(pc); break; case 2 : pd=SubtractPolyn(pa,pb); printf(多项式A(x)-B(x)=); /多项式a-b PrintPolyn(pd);break; case 3 :pf=Mu

15、lPolyn(pa,pb); printf(多项式A(x)*B(x)=); /多项式a*b PrintPolyn(pf);break;default : return 0; 6 运行与调试分析运行结构截图和调试小结(1)对于多项式的运算的,运算符的输出很重要,一开始多输出一个+,并且当为负数时会输出+-。还有当系数为0时的输出都没有专门考虑。和周围的同学交流一下算法,相互探讨了出现的问题,和解决的方法。讨论中改掉很多不足。使代码更加完善。(2)通过本次试验,我发现自己分析问题不是很全面,忽略掉一些细节。以后分析问题时要仔细考虑,认真分析,防止在细节上犯错误。(3)通过这次实验,我发现自己编程能力相当欠缺,尤其是用链表实现。自己以后要勤加练习。9 / 9

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!