版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、项目一 一元多项式的计算问题1.1设计题目与要求1.1.1设计题目1) 一元多项式计算任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将 结果输入;基本要求:在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序 流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法; 本程序关键点是如何将输入的两个多项式相加、相减操作。如何将输入的一元多项式按指数的降序排列如何确定要输入的多项式的项数;如何将输入的两个一元多项式显示出来。如何将输入的两个一元多项式进行相加操作。如何将输入的两个一元多项式进行相减操作。本程序是通过链表实现一
2、元多项式的相加减操作。1.1.2、任务定义此程序需要完成如下的要求:将多项式按照指数降序排列建立并输出,将两个一元多项式进 行相加、相减操作,并将结果输入。a:输入多项式的项数并建立多项式;b:输出多项式,输出形式分别为浮点和整数序列,序列按指数升序排列;c:多项式a和b相加,建立多项式a+b;d:多项式a和b相减,建立多项式a-b。e:多项式的输出。1.2数据结构的选择和概要设计:1.2.1数据结构的选用A:基于链表中的节点可以动态生成的特点,以及链表可以灵活的添加或删除节点的数据结 构,为了实现任意多项式的加法,减法,因此选择单链表的结构体,它有一个系数,指数, 下一个指针3个元属;例如,
3、图1中的两个线性链表分别表示一元多项式和一元多项式。从图中可见,每个结点表示多项 式中的一项。图1 多项式表的单链存储结构B:本设计使用了以下数据结构: typedef struct node int xs; int zs;struct node * next;Dnode,* Dnodelist;C:设计本程序需用到八个模块,用到以下八个子函数如下: 1.Dnodelist Creat_node(void)/*链表初始化*/2.int Insert_node(Dnodelist D,intDnodelistDnodelistDnodelistDnodelist/*系数*/*指数*/*next
4、指针*/xs,int zs)Creat_Dmeth(int length)Addresult(Dnodelist D1,Dnodelist D2)Subresult(Dnodelist D1,Dnodelist D2) select(Dnodelist D1,Dnodelist D2)/*插入函数*/*创建多项式*/*多项式相加*/*多项式相减*/*选择函数*/7void Show(Dnodelist D)/*显示(输出)函数*/8void main ()主程序模块调用链一元多项式的各种基本操作模块。1.2.2多项式的输入先输入多项式的项数,采用尾插法的方式,输入多项式中一个项的系数和指数,就
5、产生一个 新的节点,建立起它的右指针,并用头节点指向它;1.2.3两个多项式的加法“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算 规则如下:假设指针A和B分别指向多项式a和多项式b中当前进行比较的某个结点,则比较两个结点 中的指数项,有下列3种情况:指针A所指结点的指数值指针B所指结点的指数值,则应摘取A指针所指结点插入到“和 多项式”链表中去;指针A所指结点的指数值指针B所指结点的指数值,则应摘取指针A所指结点插入到“和 多项式”链表中去;指针A所指结点的指数值=指针B所指结点的指数值,则将两个结点中的系数相加,若和数不为零,则修改A所指结点的系数值,同时释放B所
6、指结点;反之,从多项式A的链 表中删除相应结点,并释放指针A和B所指结点。例如,由图2中的两个链表表示的多项式 相加得到的“和多项式”链表如图2所示,图中的长方框表示已被释放的结点。图2相加得到的和多项式上述多项式的相加过程归并两个有序表的过程极其类似,不同之处仅在于,后者 在比较数据元素时只出现两种情况。因此,多项式相加的过程也完全可以利用线性链表的基 本操作来完成。1.2.4流程图(1)在主函数中调用函数进行多项式的输入、输出,运用选择语句来选择加法、减法进行 操作,流程图如图3:图3 主函数流程图1.3系统设计1.3.1功能算法描述与数据结构说明该多项式程序除7main()函数外,主要有
7、以下函数: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)1.3.2系统主要功能函数的详细设计main()函数main函数用来实现提示使用者输入、显
8、示功能列表、调用其他运算函数实现运算功能。在main()函数中,定义m、n用来保存两个多项式的项数,pa、pb、pc、pd、pf定义程序 所需链表的头指针。在程序开始要求输入两个多项式的项数,随后根据项数创建两个链表以 保存多项式,再显示出功能列表后通过if语句来实现功能的选择,从而对整个程序流程进 行控制。Polyn CreatePolyn(Polyn head,int m)该函数功能是创建新的多项式链表。intm保存的多项式的项数,使用for语句,控制输入 多项式的每一项。当创建的链表长度为m时,将不再提示用户继续输入多项式的系数和指数。 在该函数中要用到分配空间的函数malloc()为新
9、建链表分配空间。void DestroyPolyn(Polyn p)该函数的功能是销毁掉创建的两个链表,释放内存。以辅助退出程序。void Insert(Polyn p,Polyn h)该函数功能:将新的节点?插入到现有链表的后面,并确保多项式的指数exp是升序。将s 节点插入到head所指向的链表。在该函数的操作中,要注意指针是如何移动的。Polyn AddPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式pa、pb相加,并将计算结果存储于新建立的pc中,它的原理 是将指数相同的单项式相加,系数相加后为0,则pa、pb的指针都后移。在加法计算中要 求pa,与pb的幂次
10、序都是升序,否则可能得到错误的结果。该函数调用了 int compare(Polyn a,Polyn b)的结果,用来判断多项式在同一指数下a、b 是否有为系数为0。同样也使用7malloc()关键字,为新链表创建空间。int compare(Polyn a,Polyn b)该函数功能:判断两个多项式在同一指数下是否有其中一个为系数为0。用来辅助加法和乘 法运算。Polyn SubtractPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式pa、pb相减,其原理根加法类似,将指数相同的指数相减。 与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链表的头指针
11、。void PrintPolyn(Polyn P)该函数功能:显示多项式链表。在该函数中较复杂的是如何控制链表的输出,尤其是第一项 的输出,同时还有符号的控制。在输出第一项时要判断是不是常数项,若是,则不要输出字 符x。Polyn MultiplyPolyn(Polyn pa,Polyn pb)函数功能:实现两个多项式相乘,A(X) * B(x)。计算时运用单项式与多项式相乘的法则, 然后再次运用单项式与多项式相乘的法则。1.4系统实现该程序实现了多项式的创建、多项式的加法、减法、乘法运算以及多项式的清除。为完成这 些功能,还用到了一些辅助函数。下面讨论重要函数具体实现过程及其参数的意义:链表
12、初始化函数Creat_node()带有头结点的头指针指向空(NULL)。多项式数据的创建函数Creat_Dmeth()当链表初始化成功后,开始创建多项式。分别循环输入两个多项式的系数和指数,其中 要用到插入函数。数据的插入函数Insert_node()当创建多项式时,要用到此函数,即利用插入的方式将多项式的数据连接起来。再输入 一组数据后,程序自动调用此函数,插入时也进行着排序,从表头的next开始,一一比较 指数大小,直到大于或等于当前指向的数据或遍历完所有数据时停止,然后开始链表中数值 的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将 新数据插入到最后。多项
13、式的显示函数Show()从多项式表头的next开始,直到指向空(NULL),将系数与指数一一显示。选择运算方式的函数select()三种选择:1为相加,2为相减,每一种选择调用相应的运算函数。多项式的运算函数:新建链表存储计算后的多项式1、多项式相加Addresult()创建两个指针分别指向两个多项式表头的next,分别使用两个while函数独自循环, 遍历各自的每一组数据,每遍历一次都将系数与指数存储到新建多项式的链表中。因为存储 时利用到插入函数,而插入函数中有相同指数的系数相加功能,所以直接将两个多项式的数 据依次插入到新的多项式中即可完成多项式相加。2、多项式相减Subresult()
14、创建两个指针分别指向两个多项式表头的next,以两个指针同时不为空为条件循环遍 历,如果当前多项式1的指数小于多项式2,则将当前多项式2的系数置负,指数不变,存 入新建多项式中,指向多项式2的指针指向下一个;如果如果当前多项式1的指数大于多项 式2,则将当前多项式1的系数指数不变,存入新建多项式中,指向多项式1的指针指向下 一个;否则将多项式1的系数减去2的系数后存入新建多项式中,指数不变存入,再将两个 指针同时指向下一个。结束循环后判断是哪一个多项式遍历完了,将未遍历完的多项式剩下 的数据全部插入到新建多项式中。主函数main()创建两个多项式的链表并且初始化,分别调用相应的多项式创建函数,
15、创建成功后选择 运算方式,再将运算结果输出显示。5.其它函数的介绍请参见附录I中详细代码1.5调试及运行结果该程序在VC6.0中调试通过,没有错误和警告,运行结果经过检验为正确。下图即为该程序 运行结果效果图。图中采用的是计算多项式2x2+3x1和3x2+2x3的加减两种运算进行演示:Duicua.eii1: s and Sett元争惠虽式日-算,目直号a前.入昇顼1.式|自勺可|亲0镉入多项式1系数.指数.孕组)2 2 3 1新入参项武2的组数;云项式*效,招娄以组-元多项式的计岸*1多项式相力n2多项 式和减割HHXWHHXK XX XX HXXXHXXXH XX X H H X K XX
16、 X H X H XX XX XX与加结果系数,指教,二+*Pt*cs3 ansi kcv continueBBSGt *C z DaciuLen 3 and Setl ing-sl&dMinist ratorYDebugX.-元妾娘式ti岸=ckc 输多正式的狙淞:偷入多页-3系救,指我;任组LX LI输入多项式3的组数,愉入冬项式2系效,指数;3,2 2,3元客项)盘丁十第* i专m.式扣加2多m式相域*箱诚结果系数指数 K:U1 Press anj/ ko to continue1.6源程序详见附录I附录I 一元多项式计算源代码#include #include typedef stru
17、ct node int xs; int zs; struct node * next; Dnode,* Dnodelist;/*定义结构体*/Dnodelist Creat_node(void)/*链表初始化*/ Dnodelist D; D=(Dnodelist)malloc(sizeof(Dnode); if(D) D-next=NULL; return D; int Insert_node(Dnodelist D,int xs,int zs)/*插入函数*/ Dnodelist p; Dnodelist q; Dnodelist r; p=D; while(p-next) r=p; p=
18、p-next; if(zs=p-zs)/*指数相等,系数直接相加,结束*/ p-xs=p-xs+xs; return 1; else if(zsp-zs) /*指数大于当前数据的,将数据插入当前数据之前,结束*/ q=Creat_node(); q-xs=xs; q-zs=zs; r-next=q; q-next=p; return 1; /*while(p-next)*/ q=Creat_node();/*要插入的数据指数最小,直接插入至链表最后*/q-xs=xs;q-zs=zs;q-next=p-next;p-next=q;return 1;free(p);free(q);free(r);
19、Dnodelist Creat_Dmeth(int length)/*创建多项式*/int i,m,n;Dnodelist D;D=Creat_node();for(i=0;inext;q=D2-next;while(q)x=q-xs;z=q-zs;Insert_node(D,x,z);q=q-next;while(p)x=p-xs;z=p-zs;Insert_node(D,x,z);p=p-next;/*直接插入数据,利用插入函数可完成该功能*/return D; Dnodelist Subresult(Dnodelist D1,Dnodelist D2) /*多项式相减*/ Dnodeli
20、st D; Dnodelist p,q; int x,z; D=Creat_node(); p=D1-next; q=D2-next; while(p&q) if(p-zs)zs)/*指数小(1的数据在2中不存在),直接插入*/ x=-(q-xs);/*由于是式1减式2,所以系数置负*/z=q-zs; Insert_node(D,x,z); q=q-next; else if(p-zs)(q-zs) /*指数大(2的数据在1中不存在),直接插入*/ x=p-xs; z=p-zs; Insert_node(D,x,z); p=p-next; else/*指数相同的先将系数相减,再插入*/ z=q-zs; x=(p-xs)-(q-xs); Insert_node(D,x,z); p=p-next; q=q-next; /*while(p&q)*/ while(p) x=p-xs; z=p-zs; Insert_node(D,x,z); p=p-next; while(q) x=-(q-zs);z=q-zs;Insert_node(D,x,z);q=q-next;/*将未遍历完的数据直接插入*/return D;Dnodelist select(Dnodelist D1,Dnodelist D2)/*选择函数*/Dnodelist D;int s;printf(一元多项式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年宁夏回族自治区社区工作者招聘考试参考试题及答案解析
- 2026年鸡西市梨树区社区工作者招聘考试参考题库及答案解析
- 2026年上海市徐汇区社区工作者招聘笔试参考试题及答案解析
- CNCA-C11-14:2026 强制性产品认证实施规则 汽车行驶记录仪(试行)
- 糖尿病健康宣教工具
- 2026年唐山市路南区社区工作者招聘考试参考题库及答案解析
- 2026年九江市庐山区社区工作者招聘考试备考试题及答案解析
- 2026年西安市雁塔区社区工作者招聘考试备考题库及答案解析
- 2026年山东省东营市社区工作者招聘考试参考题库及答案解析
- 2026年武汉市黄陂区社区工作者招聘笔试参考试题及答案解析
- 2026云南红河州绿春县腾达国有资本投资运营集团有限公司招聘8人笔试备考试题及答案解析
- 2026河北保定交通发展集团有限公司招聘27人备考题库及答案详解一套
- 框架结构住宅楼施工计划
- 2026江苏事业单位统考泰州市靖江市招聘42人考试参考题库及答案解析
- 浙江黄龙体育发展有限公司招聘笔试题库2026
- 2026年文化旅游演艺综合体项目文化旅游资源开发可行性研究报告
- 第二单元 2.1乡村新貌课件2026春湘美版美术三年级下册
- 湖北能源集团2025年应届毕业生招聘116人笔试参考题库附带答案详解
- 中医医疗技术相关性感染预防与控制指南(试行)
- 舆情管理体系培训课件
- 2025至2030中国贴片机行业产业运行态势及投资规划深度研究报告
评论
0/150
提交评论