2022年数据结构链式表实现一元多项式加减乘运算课程方案实验报告 .pdf
个人资料整理仅限学习使用数 据 结 构 课 程 设 计设计题目:基于链式表实现一元多项式的加减乘运算课题名称基于链式表实现一元多项式的加减乘运算院系年级专业成 绩精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 18 页个人资料整理仅限学习使用课题设计目的与设计意义1、课题设计目的:通过多项式运算程序设计用 C 语言实现),使我们进一步掌握和利用C 语言进行结构化程序设计的能力;进一步理解和运用结构化程设计的思想和方法;初步掌握开发一个小型系统程序设计的基本方法;学会调试一个较长程序的基本方法;学会利用流程图或N-S 图表示算法;以及掌握书写课程设计开发文档的能力 可按升幂写成: Pn(x=a 0+a1 x+a2 x2 +an xn-1. 它由 n+1 个系数惟一确定,因此,在计算机里,它可用一个线性表 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, 然后再次运用单项式与多项式相乘的法则。1.3 构造数据结构通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0 时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:系数信息、指数信息和指向下一个单项式的指针。通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。基于以上的分析,我们定义多项式的数据结构为如下结构体形式:typedef struct Polynomial float coef。/系数 int expn。/指数 struct Polynomial *next。/指向下一个结点*Polyn,Polynomial 。 /Polyn为结点指针类型2 系统分析2.1 可行性研究该程序主要从技术的角度来分析可行性。技术上的可行性研究主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。该系统采用了 Windows XP操作系统结合 Visual C+ 6.0,TC 2.0等软件开发平台已成熟可行。硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,其硬件平台也比较能满足此系统的需要。此外,还有经济可行性,用户使用可行性,法律可行性等可行性研究,这里从简省去。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 18 页个人资料整理仅限学习使用2.2 系统结构与主要功能模块从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块。如:1. 多项式创建功能;2. 多项式运算功能;3. 操作界面显示功能;4. 销毁多项式的功能;5. 多项式复制功能等。系统的整体流程和主要功能模块如图2-1 所示精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 18 页个人资料整理仅限学习使用开始输入选择显示加法显示功能表输入pa系数、指数退出输入pb系数、指数减法乘法i=m i=m im im 算法流程图精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 18 页个人资料整理仅限学习使用3 系统设计3.1 系统设计目的与要求通过多项式运算程序设计 用 C语言实现),使我们进一步掌握和利用C语言进行结构化程序设计的能力;进一步理解和运用结构化程设计的思想和方法;初步掌握开发一个小型系统程序设计的基本方法;学会调试一个较长程序的基本方法;学会利用流程图或N-S 图表示算法;以及掌握书写课程设计开发文档的能力 函数外,主要有以下函数:void Insert(Polyn p,Polyn h Polyn CreatePolyn(Polyn head,int m void DestroyPolyn(Polyn 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 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 18 页个人资料整理仅限学习使用下面对这些函数逐一介绍。3.3. 系统主要功能函数的详细设计1. main)函数main 函数用来实现提示使用者输入、显示功能列表、调用其他运算函数实现运算功能。在 main 该函数功能是创建新的多项式链表。int m保存的多项式的项数,使用for语句,控制输入多项式的每一项。当创建的链表长度为m 时,将不再提示用户继续输入多项式的系数和指数。在该函数中要用到分配空间的函数malloc(为新建链表分配空间。3. void DestroyPolyn(Polyn p 该函数的功能是销毁掉创建的两个链表,释放内存。以辅助退出程序。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,Polyn b的结果,用来判断多项式在同一指数下 a、b 是否有为系数为0。同样也使用了malloc( 关键字,为新链表创建空间。6. int compare(Polyn a,Polyn b 该函数功能:判断两个多项式在同一指数下是否有其中一个为系数为0。用来辅助加法和乘法运算。7. Polyn SubtractPolyn(Polyn pa,Polyn pb 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 18 页个人资料整理仅限学习使用该函数功能:实现两个多项式pa、pb 相减,其原理根加法类似,将指数相同的指数相减。与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链表的头指针。8. void PrintPolyn(Polyn P 该函数功能:显示多项式链表。在该函数中较复杂的是如何控制链表的输出,尤其是第一项的输出,同时还有符号的控制。在输出第一项时要判断是不是常数项,若是,则不要输出字符x。9. Polyn MultiplyPolyn(Polyn pa,Polyn pb 函数功能:实现两个多项式相乘,A(X * B(x 。计算时运用单项式与多项式相乘的法则,然后再次运用单项式与多项式相乘的法则。4 系统实现该程序实现了多项式的创建、多项式的加法、减法、乘法运算以及多项式的清除。为完成这些功能,还用到了一些辅助函数。下面讨论重要函数具体实现过程及其参数的意义:1. Polyn CreatePolyn(Polyn head,int m该函数的两个参数, head 表示为创建的链表的头指针,m表示为链表的长度,即多项式的项数。定义int i计数,当 i int i。/用来计数 Polyn p。/定义一个 p链表 p=head=(Polynmalloc(sizeof(struct Polynomial。 head-next=NULL。 for(i=0。i 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 18 页个人资料整理仅限学习使用 p=(Polynmalloc(sizeof(struct Polynomial。/建立新结点以接收数据 printf( 请输入第 %d项的系数与指数 :,i+1。 scanf(%f %d,&p-coef,&p-expn 。 Insert(p,head 。 /调用Insert函数插入结点 return head 。/CreatePolyn 2. void Insert(Polyn p,Polyn h 该函数具有两个参数,用来实现链表的顺序排列和合并相同的项。以下是实现插入的关键代码: 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-expn / 将指数相同相合并 q2-coef+=p-coef。 free(p。 if(!q2-coef / 系数为 0的话释放结点 q1-next=q2-next。free(q2。 else /指数为新时将结点插入 p-next=q2。 q1-next=p。 /Insert 3. Polyn AddPolyn(Polyn pa,Polyn pb 该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。其计算的结果存放在新建的pc所指向的链表中。函数中调用了int compare(Polyn a,Polyn b的结果。下面是实现加法的关键代码:Polyn AddPolyn(Polyn pa,Polyn pb/求解并建立多项式 a+b,返回其头指针精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 18 页个人资料整理仅限学习使用 Polyn qa=pa-next。 Polyn qb=pb-next。 Polyn headc,hc,qc 。 hc=(Polynmalloc(sizeof(struct Polynomial。/建立头结点 hc-next=NULL 。 headc=hc 。 while(qa|qb qc=(Polynmalloc(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-expn=qa-expn 。 qa=qa-next。 qb=qb-next。 break。 case -1: qc-coef=qb-coef。 qc-expn=qb-expn。 qb=qb-next。 break。 /switch if(qc-coef!=0 qc-next=hc-next。 hc-next=qc。 hc=qc。 else free(qc 。/当相加系数为 0时,释放该结点 /while 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 18 页个人资料整理仅限学习使用 return headc 。/AddPolyn int compare(Polyn a,Polyn b if(a&b if(!b|a-expnb-expn return 1。 else if(!a|a-expnexpn return -1 。 else return 0 。 else if(!a&b return -1 。/a多项式已空,但 b多项式非空 else return 1 。/b多项式已空,但 a多项式非空/compare 4.Polyn MultiplyPolyn(Polyn pa,Polyn pb 该函数同加法一样,拥有相同的参数并且同样将新建立的链表pf的指针返回,用来实现输出乘法结果。下面给出关键代码:Polyn MultiplyPolyn(Polyn pa,Polyn pb Polyn hf,pf。 Polyn qa=pa-next。 Polyn qb=pb-next。 hf=(Polynmalloc(sizeof(struct Polynomial 。/建立头结点 hf-next=NULL 。 for(。qa。qa=qa-next for(qb=pb-next。qb。qb=qb-next pf=(Polynmalloc(sizeof(struct Polynomial。 pf-coef=qa-coef*qb-coef。 pf-expn=qa-expn+qb-expn 。 Insert(pf,hf。/调用Insert函数以合并指数相同的项 return hf。/MultiplyPolyn 5. 其它函数的介绍请参见附录中详细代码. 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 18 页个人资料整理仅限学习使用5 调试及运行结果该程序在VC6.0 中调试通过,没有错误和警告,运行结果经过检验为正确。以下图5-1即为该程序运行结果效果图。图中采用的是计算多项式4x5+2x2+3x 和 x10+7x2 的加减乘三种运算进行演示:算法调试,运行结果图6 收获和体会通过这次课程设计练习,使我更深刻地理解了语言的精髓-指针的使用。完成整个程序设计有,对指针掌握的更加熟练。同时通过直接对链表的操作,加深了对数据结构的理解和认识。并在完成课程设计的过程作主动查阅了相关资料,学到了不少课本上没有的技术知识。输入两个多项式的每一项值提示功能选择进行三则运算的结果精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 18 页个人资料整理仅限学习使用经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。编程是一件枯燥乏味工作,但是只要认真专研,我们会从中学到很多在课本上学不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。兴趣是可以培养的,只要坚持下去,面对困难我们总能够找到解决问题的方法。计算多项式的加、减、乘法运算-该程序虽然不是很大,这次还是由几位同学合作才完成这一任务。在这个小组中我是组长,通过分工与合作,使我充分认识到在工程团队开发过程中合作的重要性,也更加理解了沟通协作能力在软件开发行业中的重要性。另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。老师在教案过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。同样也是老师的严格要求才使得小组成员能够顺利的完成任务。附录#include #include /*/typedef struct Polynomial float coef。/系数 int expn。/指数 struct Polynomial *next。/指向下一个结点*Polyn,Polynomial 。 /Polyn为结点指针类型/*/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-expn / 将指数相同相合并 q2-coef+=p-coef。 free(p。 if(!q2-coef / 系数为 0的话释放结点 q1-next=q2-next。 free(q2。 else / 指数为新时将结点插入 p-next=q2。 q1-next=p。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 18 页个人资料整理仅限学习使用 /Insert /*以下函数实现建立一个多项式*/Polyn CreatePolyn(Polyn head,int m/建立一个头指针为 head 、项数为 m的一元多项式/在主程序初始时,先输入的多项式中的项数m、n 在这里为 m。主程序中的 pa、pb在此为 head int i。/用来计数 Polyn p。/定义一个 p链表 p=head=(Polynmalloc(sizeof(struct Polynomial。 head-next=NULL。 for(i=0。i p=(Polynmalloc(sizeof(struct Polynomial。/建立新结点以接收数据 printf( 请输入第 %d项的系数与指数 :,i+1。 scanf(%f %d,&p-coef,&p-expn 。 Insert(p,head 。 /调用Insert函数插入结点 return head 。/CreatePolyn /*以下函数实现多项式的销毁*/void DestroyPolyn(Polyn p/ 销毁多项式 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 / 若多项式为空,输出 0 putchar(0。 printf(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。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 18 页个人资料整理仅限学习使用 else printf(X%d,q-expn 。 if(q-coef=-1 if(!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 /*在下面的辅助乘法和加法运算*/int compare(Polyn a,Polyn b if(a&b if(!b|a-expnb-expn return 1。 else if(!a|a-expnexpn 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-next。 Polyn qb=pb-next。 Polyn headc,hc,qc 。 hc=(Polynmalloc(sizeof(struct Polynomial。/建立头结点 hc-next=NULL 。 headc=hc 。while(qa|qb qc=(Polynmalloc(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-expn=qa-expn 。 qa=qa-next 。 qb=qb-next。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 18 页个人资料整理仅限学习使用 break。 case -1: qc-coef=qb-coef。 qc-expn=qb-expn 。 qb=qb-next。 break。 /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。 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/求解并建立多项式 a*b,返回其头指针 (该函数实现乘法 Polyn hf,pf。 Polyn qa=pa-next。 Polyn qb=pb-next。 hf=(Polynmalloc(sizeof(struct Polynomial。/建立头结点hf-next=NULL 。 for(。qa。qa=qa-next for(qb=pb-next。qb。qb=qb-next pf=(Polynmalloc(sizeof(struct Polynomial。 pf-coef=qa-coef*qb-coef。 pf-expn=qa-expn+qb-expn。 Insert(pf,hf。/调用Insert函数以合并指数相同的项精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 18 页个人资料整理仅限学习使用 return hf。/MultiplyPolyn /*主函数实现显示与功能选择*/int main( int m,n,flag=0。/m、n为分别为 a、b两个多项式的项数 Polyn pa=0,pb=0,pc,pd,pf 。/定义各式的头指针, pa与pb在使用前付初值 NULL /pc头指针所在的多项式用在加法中作为结果,pd用在加法中, pf乘法中printf(*欢迎使用一元多项式运算程序*n。 printf(请输入第一个多项式 a的项数 :。 scanf(%d,&m 。 pa=CreatePolyn(pa,m 。/建立第一个多项式 a printf(请输入第二个多项式 b的项数 :。 scanf(%d,&n。 pb=CreatePolyn(pb,n 。/建立第二个多项式 b /输出菜单 printf(*n。printf( 情选择您要进行的操作:nt1.输出多项式 a和bnt2.建立多项式 a+bnt3.建立多项式 a-bn。printf(t4. 计算多项式 a*b的值 nt5.退出n。 for(。flag=0 printf(n 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 18 页