数据结构一元多项式的运算_第1页
数据结构一元多项式的运算_第2页
数据结构一元多项式的运算_第3页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、目录一、问题分析 11.1 问题描述 . 11.2 问题的数学模型 11.3 构造数据结构 1二、系统分析 22.1 可行性研究 . 22.2 系统结构与主要功能模块 2三、系统设计 43.1 系统设计目的与要求 43.2 系统设计内容 43.3 功能算法描述与数据结构说明 4四、系统实现 7五、调试及运行结果 12六、收获和体会 13附录 141 问题分析1.1 问题描述设计一个 n 元多项式程序,并完成多项式的乘法运算。从实际的角度出发,这里设计的程序是基于一元 n 次多项式的数学模型。1.2 问题的数学模型在数学上,一个一元多项式 Pn(x)可按升幕写成:Pn (x)=a 0+a1 x+

2、a2 xA2 +an xAn-1 .它由n+1个系数惟一确定,因此,在计算机里,它可用一个线性表 P来表示: Pn=(a0,a1,a2,,每一项的指数i隐含在其系数ai的序号里。多项式的乘法规则:多次运用单项式与多项式相乘的法则得到的计算时(a+b)(m+n),先把(m+n)看成一个单项式,(a+b)是一个多项式,运用单项式与多项式 相乘的法则,得到(a+b)(m+n)=a(m+n)+b(m+n),然后再次运用单项式与多项式相乘的法 则。1.3 构造数据结构通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具 有系数和指数,当系数为 0时,该项就失去了意义,在计算机内要表示一

3、个多项式, 至少以下数据信息:系数信息、指数信息和指向下一个单项式的指针。通过指针,我 们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲, 单项式也是一个多项式。基于以上的分析,我们定义多项式的数据结构为如下结构体 形式:typedef struct Polynomialfloat coef;/ 系数int exp n; 指数struct Poly nomial *n ext;/ 指向下一个结点*Polyn,Polynomial;/Polyn 为结点指针类型2 系统分析2.1 可行性研究该程序主要从技术的角度来分析可行性。 技术上的可行性研究主要分析技术条件 能否顺利完

4、成开发工作, 硬、软件能否满足开发者的需要等。 该系统采用了 WindowsXP 操作系统结合 Visual C+ 6.0,TC 2.0 等软件开发平台已成熟可行。硬件方面,科技飞 速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,其硬件 平台也比较能满足此系统的需要。此外,还有经济可行性,用户使用可行性,法律可 行性等可行性研究,这里从简省去。2.2 系统结构与主要功能模块从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块。如:1. 多项式创建功能;2. 多项式运算功能;3. 操作界面显示功能;4. 销毁多项式的功能;5. 多项式复制功能等。系统的整体流程和主要

5、功能模块如图 2-1 所示图2-13 系统设计3.1 系统设计目的与要求通过多项式运算程序设计(用 C 语言实现),使我们进一步掌握和利用 C 语言进 行结构化程序设计的能力;进一步理解和运用结构化程设计的思想和方法;初步掌握 开发一个小型系统程序设计的基本方法;学会调试一个较长程序的基本方法;学会利 用流程图或 N-S 图表示算法;以及掌握书写课程设计开发文档的能力(书写课程设计 报告)。总之,通过本课程设计加深对C语言及数据结构课程所学知识的理解, 进一步巩固C语言语法规则,在程序中体现出算法的思想,提高程序的运行效率。学 会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综

6、合性实际 问题的能力。3.2 系统设计内容多项式运算程序具有以下基本功能: 1界面输出,提示如何输入数据。要求先输入多项式的项数。 2创建多项式。接收输入的数据,并保存到链表中。 3显示程序的功能表,允许使用者选择运算类型。4显示已经创建好的多项式。6实现加法运算。7实现减法运算。8实现乘法运算。9清除内存内容,销毁创建的链表,退出程序。3.3 功能算法描述与数据结构说明该多项式程序除了 main() 函数外,主要有以下函数:void Insert(Polyn p,Polyn h)Polyn CreatePolyn(Polyn head,int m)void DestroyPolyn(Poly

7、n p)void PrintPolyn(Polyn P)int compare(Polyn a,Polyn b)Polyn AddPolyn(Polyn pa,Polyn pb)Polyn SubtractPolyn(Polyn pa,Polyn pb)Polyn MultiplyPolyn(Polyn pa,Polyn pb)下面对这些函数逐一介绍。3.3. 系统主要功能函数的详细设计1. main ()函数main 函数用来实现提示使用者输入、 显示功能列表、 调用其他运算函数实现运算 功能。在main ()函数中,定义 m n用来保存两个多项式的项数,pa、pb、pc、pd、 pf 定义

8、程序所需链表的头指针。 在程序开始要求输入两个多项式的项数, 随后根据项 数创建两个链表以保存多项式, 再显示出功能列表后通过 if 语句来实现功能的选择, 从而对整个程序流程进行控制。2. Polyn CreatePolyn(Polyn head,int m)该函数功能是创建新的多项式链表。int m保存的多项式的项数,使用for语句, 控制输入多项式的每一项。当创建的链表长度为m时,将不再提示用户继续输入多项式的系数和指数。在该函数中要用到分配空间的函数malloc()为新建链表分配空间。3. void DestroyPolyn(Polyn p)该函数的功能是销毁掉创建的两个链表,释放内存

9、。以辅助退出程序。4. void Insert(Polyn p,Polyn h)该函数功能:将新的节点p插入到现有链表的后面,并确保多项式的指数 exp是 升序。将 s 节点插入到 head 所指向的链表。在该函数的操作中,要注意指针是如何 移动的。5. Polyn AddPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式pa、pb相加,并将计算结果存储于新建立的pc中,它的原理是将指数相同的单项式相加,系数相加后为0,则 pa、pb 的指针都后移。在加法计算中要求pa,与pb的幕次序都是升序,否则可能得到错误的结果。该函数调用了 int compare(Polyn a

10、,Polyn b)的结果,用来判断多项式在同一指 数下 a、b 是否有为系数为 0。同样也使用了 malloc() 关键字,为新链表创建空间。6. int compare(Polyn a,Polyn b)该函数功能:判断两个多项式在同一指数下是否有其中一个为系数为 0。用来辅 助加法和乘法运算。7. Polyn SubtractPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式 pa、pb 相减,其原理根加法类似,将指数相同的 指数相减。与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链 表的头指针。8. void PrintPolyn(Polyn P)该

11、函数功能:显示多项式链表。在该函数中较复杂的是如何控制链表的输出,尤 其是第一项的输出,同时还有符号的控制。在输出第一项时要判断是不是常数项,若 是,则不要输出字符 x。9. Polyn MultiplyPolyn(Polyn pa,Polyn pb)函数功能:实现两个多项式相乘, A(X) * B(x) 。计算时运用单项式与多项式相 乘的法则,然后再次运用单项式与多项式相乘的法则。4 系统实现该程序实现了多项式的创建、 多项式的加法、 减法、乘法运算以及多项式的清除为完成这些功能,还用到了一些辅助函数。下面讨论重要函数具体实现过程及其参数的意义:1. Polyn CreatePoly n(P

12、olyn head,i nt m)该函数的两个参数,head表示为创建的链 表的头指针,m表示为链表的长度,即多项式的项数。定义int i计数,当i<m时,for 语句反复提示用户输入该多项式的每一项的指数和系数,并保存。当 i=m 时,输入完 毕,该链表也创建完毕。详细的实现过程如下:Polyn CreatePolyn(Polyn head,int m)int i;/ 用来计数Polyn p;定义一个p链表p=head=(Polyn)malloc(sizeof(struct Polynomial);head->next=NULL;for(i=0;i<m;i+)p=(Poly

13、 n) malloc(sizeof(struct Poly no mial);/ 建立新结点以接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head);调用Insert函数插入结点return head;/CreatePolyn2. void Insert(Polyn p,Polyn h) 该函数具有两个参数, 用来实现链表的顺序排列和合并相同的项。以下是实现插入的关键代码:void Insert(Polyn p,Polyn

14、 h)if(p->coef=0) free(p);/系数为 0 的话释放结点else/如果系数不为0Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn) /查找插入位置q1=q2;q2=q2->next; if(q2&&p->expn=q2->expn)/将指数相同相合并q2->coef+=p->coef;free(p);if(!q2->coef) /系数为 0 的话释放结点q1->next=q2->next;free(q2);

15、 else/指数为新时将结点插入p->next=q2;q1->next=p;/Insert3. Polyn AddPoly n(Polyn pa,Poly n pb)该函数有两个参数,其类型均为 poly n,分 别表示要相加的两个不同的多项式。其计算的结果存放在新建的 pc 所指向的链表中。 函数中调用了 int compare(Polyn a,Polyn b的结果。下面是实现加法的关键代码:Polyn AddPolyn(Polyn pa,Polyn pb)求解并建立多项式 a+b,返回其头指针Polyn qa=pa->next;Polyn qb=pb->next;P

16、olyn headc,hc,qc;hc=(Poly n) malloc(sizeof(struct Poly no mial);/ 建立头结点hc->next=NULL;headc=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;break;case 0: qc->coef=qa->coef+qb->coef; qc-&

17、gt;expn=qa->expn;qa=qa->next;qb=qb->next;break;case -1:qc->coef=qb->coef; qc->expn=qb->expn;qb=qb->next; break;/switchif(qc->coef!=0) qc->next=hc->next;hc->next=qc;hc=qc;else free(qc);/当相加系数为0时,释放该结点 /whilereturn headc;/AddPolynint compare(Polyn a,Polyn b)if(a&

18、;&b)if(!b|a->expn>b->expn) return 1;else if(!a|a->expn<b->expn) return -1;else return 0;else if(!a&&b) return -1;/a 多项式已空,但 b 多项式非空else return 1;/b多项式已空,但a多项式非空/compare4. Polyn MultiplyPolyn(Polyn pa,Polyn pb) 该函数同加法一样, 拥有相同的参数并 且同样将新建立的链表 pf 的指针返回,用来实现输出乘法结果。下面给出关键代码:

19、Polyn MultiplyPolyn(Polyn pa,Polyn pb)Polyn hf,pf;Polyn qa=pa->next;Polyn qb=pb->next;hf=(Poly n)malloc(sizeof(struct Poly no mial);/ 建立头结点 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->

20、coef;pf->expn=qa->expn+qb->expn;Insert(pf,hf);/调用Insert函数以合并指数相同的项return hf;/MultiplyPolyn5. 其它函数的介绍请参见附录中详细代码5调试及运行结果该程序在VC6.0中调试通过,没有错误和警告,运行结果经过检验为正确。以下图5-1即为该程序运行结果效果图。图中采用的是计算多项式4xA5+2xA2+3x和xA10+7xA2的加减乘三种运算进行演示:I国一入入入入入入入的项数汨 1项齿系数与指数订1 2项的索薮与浦数江2 孑项的系数与谒数汽5 三谤项式顶数詔 1项癖数与指数汐2 2项的系数与椿

21、数江18输入两个多项式的每项值aaB 曰 斐式式式 操项项项项 的多多多多 行出立立算出 y!-.- 里 12 3 4 5ti的提示功能选择多项式z 4«A5 +2MA2+3H多质式b;沪1百切:临进行三则运算的结果2多项式扎巧:XA18+4K +9X2+2H3多项贰盯b: -KA10+4X"S-5K*2*3K4多项式护h; Krt152XA12+»rtH+28KA7+14«rt4*21WAaPress suny ke 寸 to con t in tie图5-16 收获和体会通过这次课程设计练习,使我更深刻地理解了C语言的精髓-指针的使用完成整个程序设计

22、有,对指针掌握的更加熟练。同时通过直接对链表的操作,加深了对数据结构的理解和认识。并在完成课程设 计的过程作主动查阅了相关资料,学到了不少课本上没有的技术知识。经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。编程是一件枯燥乏味工作,但是只要认真专研,我们会从中学到很多在课本上学 不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。兴趣是可以培 养的,只要坚持下去,面对困难我们总能够找到解决问题的方法。计算多项式的加、减、乘法运算 该程序虽然不是很大,这次还是由几位同学合作才完成这一任务。在这个小组中我是

23、组长,通过分工与合作,使我充分认识到 在项目团队开发过程中合作的重要性, 也更加理解了沟通协作能力在软件开发行业中 的重要性。另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指 导。老师在教学过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。同样 也是老师的严格要求才使得小组成员能够顺利的完成任务。附录#include<stdio.h>#include<malloc.h>/*/ typedef struct Polynomialfloat coef;/ 系数int exp n;/ 指数struct Poly nomial *n ext;/ 指向下

24、一个结点*Polyn,Polynomial;/Polyn 为结点指针类型/*/void Insert(Polyn p,Polyn h)if(p->coef=0) free(p);/系数为 0 的话释放结点else如果系数不为0Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn)/查找插入位置q1=q2;q2=q2->next;if(q2&&p->expn=q2->expn)/将指数相同相合并q2->coef+=p->coef;free(p);if

25、(!q2->coef)/系数为 0的话释放结点q1->next=q2->next;free(q2);/指数为新时将结点插入elsep->next=q2;q1->next=p;/Insert以下函数实现建立一个多项式 */Polyn CreatePolyn(Polyn head,int m)建立一个头指针为 head 项数为 m的一元多项 式在主程序初始时,先输入的多项式中的项数m、n在这里为m。主程序中的pa、pb 在此为 headint i;用来计数Polyn p;定义一个p链表 p=head=(Polyn)malloc(sizeof(struct Polyno

26、mial); head->next=NULL;for(i=0;i<m;i+)p=(Poly n)malloc(sizeof(struct Poly no mial);/ 建立新结点以接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head);/调用Insert函数插入结点return head;/CreatePolyn/*以下函数实现多项式的销毁 */void DestroyPolyn(Polyn p)/ 销毁多项

27、式 p Polyn q1,q2;q1=p->next;q2=q1->next;while(q1->next)free(q1);q1=q2;/指针后移 q2=q2->next;/*以下函数实现显示输出多项式 * */void PrintPolyn(Polyn P)Polyn q=P->next;int flag= 1 ;/项数计数器if(!q) / 若多项式为空,输出 0putchar('0');printf("n");return;while (q)if(q->coef>0&&flag!=1) put

28、char('+'); / 系数大于 0 且不是第一项 if(q->coef!=1&&q->coef!=-1)/ 系数非 1 或-1 的普通情况 printf("%g",q->coef);if(q->expn=1) putchar('X');else if(q->exp n) pri ntf("XA%d",q->exp n);elseif(q->coef=1)if(!q->expn) putchar('1');else if(q->expn

29、=1) putchar('X');else printf("XA%d",q->expn);if(q->coef=-1)if(!q->expn) printf("-1"); else if(q->expn=1) printf("-X"); else prin tf("-XA%d",q->exp n);q=q->next;flag+;/whileprintf("n");/PrintPolyn在下面的辅助乘法和加法运算 */int compare(P

30、olyn a,Polyn b)if(a&&b)if(!b|a->expn>b->expn) return 1;else if(!a|a->expn<b->expn) return -1;else return 0;else if(!a&&b) return -1;/a 多项式已空,但 b 多项式非空else return 1;/b多项式已空,但a多项式非空/compare/*以下函数实现加法 */Polyn AddPolyn(Polyn pa,Polyn pb)/求解并建立多项式 a+b,返回其头指针Polyn qa=pa-&

31、gt;next;Polyn qb=pb->next;Polyn headc,hc,qc;hc=(Poly n) malloc(sizeof(struct Pol yno mial);/ 建立头结点 hc->next=NULL;headc=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;break;case 0:qc->coef=q

32、a->coef+qb->coef;qc->expn=qa->expn;qa=qa->next;qb=qb->next;break;case -1:qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;/switchif(qc->coef!=0)qc->next=hc->next;hc->next=qc;hc=qc;else free(qc);/当相加系数为0时,释放该结点 /whilereturn headc;/AddPolyn/*以下函数实现减法 *

33、/Polyn SubtractPolyn(Polyn pa,Polyn pb)/求解并建立多项式 a+b,返回其头指针 Polyn h=pb;Polyn 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 MultiplyPolyn(Polyn pa,Polyn pb)/求解并建立

34、多项式 a*b,返回其头指针(该函数实现乘法 )Polyn hf,pf;Polyn qa=pa->next;Polyn qb=pb->next;hf=(Poly n)malloc(sizeof(struct Poly no mial);/ 建立头结点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;

温馨提示

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

评论

0/150

提交评论