




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 数据结构 课程设计说明书题目: 一元稀疏多项式简单计数器学生姓名: 学 号: 院 (系): 理学院 专 业: 数学与应用数学 指导教师: 张洲平 2011年 12月23日陕 西 科 技 大 学 数据结构 课程设计任务书 理 学院 数学与应用数学 专业 班级 学生: 题目: 一元稀疏多项式简单计数器 课程设计从 2011 年 12 月 19 日起到 2011 年 12 月 23 日1、课程设计的内容和要求(包括原始数据、技术要求、工作要求等): 一元稀疏多项式简单计数器 (1) 输入并建立多项式 (2) 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2cn ,en,其中n是多项式的项
2、数,ci,ei分别为第i项的系数和指数。序 列按指数降序排列。 (3) 多项式a和b相加,建立多项式a+b,输出相加的多项式。 (4) 多项式a和b相减,建立多项式a-b,输出相减的多项式。 用带头结点的单链表存储多项式。 2、对课程设计成果的要求包括图表、实物等硬件要求:1)根据课程设计题目要求编写所需程序代码 要求可以实现多项式的建立,以及两个多项式的相加、减,并且输出相加、减后所得的结果,同时用手算也可验证实验结果是否符合要求。 2)提交课程设计报告 按照具体要求完成课程设计报告,其中包括问题的描述、算法思想、程序实现结果、数据验证和实验总结等部分。 3、课程设计工作进度计划:时间设计任
3、务及要求1-10搜集学习相关资料,明确实验要求、目的1-11分析课题,理清编程思路1-12编写程序,修改程序1-13代入数据,进行整体调试,运行,再修改1-14性能分析,撰写设计说明书 指导教师: 日期: 2011-11-15 教研室主任: 日期: 目 录一、问题描述1二、算法思想2三、数据结构3四、设计模块划分4五、源程序5六、算法分析10七、运行结果11八、设计总结与体会13参考文献 141.问题描述:一元稀疏多项式简单计数器基本要求:(1) 输入并建立多项式(2) 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指
4、数。序列按指数降序排列。(3) 多项式a和b相加,建立多项式a+b,输出相加的多项式。(4) 多项式a和b相减,建立多项式a-b,输出相减的多项式。用带头结点的单链表存储多项式。测试数据:(1)(2x+5x8-3.1x11)+(7-5x8+11x9)(2)(6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15)(3)(x+x2+x3)+0(4)(x+x3)-(-x-x-3)2.算法思想:(1)建立多项式一元多项式是由多个项的和组成的,将一元多项式的每个项用一结点表示,该结点中应包括该项的系数、该项的指数、指向下一项的指针,可以用线性表来依次输入各项结点,从而完成多项式
5、链表的建立,为了使原多项式各项顺序不变,故采用尾插法建表。(2)降幂输出多项式我们可以先设一个幂指数i为可输入的最大幂指数,然后从首元结点开始顺次查询每一结点的指数和i,若相等则输出该结点,否则,i-,继续从首元结点开始查询,重复上述过程,直到i为可输入的最小幂指数。这样,就按指数降幂输出了多项式。多项式的项数统计可以通过头结点的next来实现,若非空,count+,直到结点的指针域为空,这样,count就统计出了项数。(3) 多项式相加多项式的相加过程,其实就是相同指数的项的系数相加,不同指数的项复制到和多项式中,将结果用降幂输出函数输出。(4) 多项式相减多项式的相减过程,其实就是相同指数
6、的项的系数相减,对于不同指数的项,若是被减多项式,则将该结点复制输出,若是减多项式,则将该结点的系数变为原系数的相反数输出,将结果用降幂输出函数输出。3.数据结构:带头结点单链表抽象数据类型的结点结构定义如下:typedef struct polynode /多项式结点int coef; /系数int exp; /指数polynode *next;polynode ,*polylist;4.模块划分:(1) 带头结点的多项式的建立函数polylist polycreate()(2) 带头结点的多项式的降幂输出函数void printf(polylist poly)(3) 带头结点的多项式的相加
7、函数polylist polyadd(polylist a,polylist b)(4) 带头结点的多项式的相减函数polylist polysub(polylist a,polylist b)(5) 主函数void main()5.源程序:#include#includetypedef struct polyomial float coef; int expn; struct polyomial *next;*poly,polyomial; /poly为结点指针类型void insert(poly p,poly h) if(p-coef=0) free(p); /系数为0时释放结点 else
8、 poly 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; /insertpoly createpoly(poly head,int m)/建立一个头指针为head、项数为m的一元多项式 int i; pol
9、y p; p=head=(poly)malloc(sizeof(struct polyomial); head-next=null; for(i=0;icoef,&p-expn); insert(p,head); /调用insert函数插入结点 return head;/createpolyvoid destroypoly(poly p)/销毁多项式p poly q1,q2; q1=p-next; q2=q1-next; while(q1-next) free(q1); q1=q2;/指针后移 q2=q2-next; void printpoly(poly p) poly q=p-next;
10、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)
11、 putchar(x); 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);/printpolyint compare(poly a,poly b) if(a&b) if(!b|a-expnb-expn) return 1; else if(!a|a-expnexpn) return -1; else return 0; else if(!a
12、&b) return -1;/a多项式已空,但b多项式非空 else return 1;/b多项式已空,但a多项式非空/comparepoly addpoly(poly pa,poly pb)/求解并建立多项式a+b,返回其头指针 poly qa=pa-next; poly qb=pb-next; poly headc,hc,qc; hc=(poly)malloc(sizeof(struct polyomial);/建立头结点 hc-next=null; headc=hc; while(qa|qb) qc=(poly)malloc(sizeof(struct polyomial); switc
13、h(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);/当相加系数
14、为0时,释放该结点 /while return headc;/addpolypoly subtractpoly(poly pa,poly pb) /求解并建立多项式a+b,返回其头指针 poly h=pb; poly p=pb-next; poly pd; while(p) /将pb的系数取反 p-coef*=-1; p=p-next; pd=addpoly(pa,h); for(p=h-next;p;p=p-next) /恢复pb的系数 p-coef*=-1; return pd;/subtractpolyint main() int m,n,flag=0; float x; poly pa
15、=0,pb=0,pc,pd,pe,pf;/定义各式的头指针,pa与pb在使用前付初值null printf(输入a的项数:); scanf(%d,&m); pa=createpoly(pa,m);/建立多项式a printf(输入b的项数:); scanf(%d,&n); pb=createpoly(pb,n);/建立多项式b for(;flag=0) printf(执行操作); scanf(%d,&flag); if(flag=1) printf(多项式a:);printpoly(pa); printf(多项式b:);printpoly(pb);continue; if(flag=2) pc
16、=addpoly(pa,pb); printf(多项式a+b:);printpoly(pc); destroypoly(pc);continue; if(flag=3) pd=subtractpoly(pa,pb); printf(多项式a-b:);printpoly(pd); destroypoly(pd);continue; if(flag=4) break; if(flag4) printf(error!n);continue; /for destroypoly(pa); destroypoly(pb); return 0;6.算法分析建立多项式的时间复杂度为o(n),降幂输出多项式序列
17、算法,由于是对指数做的循环,每次循环都需要从首元结点查找到表尾,假设多项式开始为升幂排列,如x1+x2+x3+x4+xn,(这里n=20)其时间复杂度为n(n+1)/2,若指数不是连续的,则其时间复杂度加上o(n),所以此算法的时间复杂度为o(n2)。假设a有m项,b有n项,则加法和减法算法的时间复杂度度为m+n,算法中两多项式相加和相减时,a,b均需按升幂顺序输入结点。7.运行结果:(1)(2x+5x8-3.1x11)+(7-5x8+11x9)程序运行结果为:(2)(6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15)程序运行结果为:(3)(x+x2+x3)+0程
18、序运行结果为:(4) (x+x3)-(-x-x-3)程序运行结果为:8.设计体会与总结本次程序设计的总体思路明确,易懂,能够清楚的分辨出各模块的功能,利于用户的阅读、了解程序,该程序的执行过程是相当的易于读者使用,它会在每一步都提示用户接下来的输入数据。当然,本次课程设计还有许多的不足之处,在以后的不断学习当中我还会继续完善这个程序。在课程设计的过程中,深深地体会到了有算法思想和将此算法写成可执行程序,还是有一段距离的,程序出现错误并不可怕,只要我们肯耐心的去调试,去改进,最后一定会设计出一个比较好的程序。拿到课题后,我们首先要对要实现的功能以及数据结构有一个初步的规划,这样后边的工作才会顺利进行。若是在编写或执行程序的过程中遇到了确实解决不了的问题,需要多和同学交流。通过做本次课程设计,使我收获了很多东西,知识这方面说起,以前觉得不管什么样的题还是编程,只要了解算法的思想就行了,到时候用的时候自然就会发挥出来,可这次的课程设计却告诉我并不是这样的,我在此次课程设计的编程的时候就遇到了这样的问题。觉得自己了解算法思想就一定能编出来,可是事实却不得不又拿起书来继续研究,继续查找一些
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 排水沟穿越道路施工方案
- 水污染治理工程施工方案
- 濮阳拉森钢板桩施工方案
- 辽宁民宿文旅施工方案
- 幼儿园获奖公开课:小班数学《草裙舞》教学设计
- 灯箱广告改造施工方案
- 正安建筑打桩施工方案
- 数控加工工艺与编程技术基础 教案 模块三 项目二 综合件的加工(3-4)
- 水稻种植中多发病虫害的发生特点及针对性绿色防控技术具体分析
- 【专精特新】折叠屏手机行业市场份额证明材料(智研咨询发布)
- 立体库风险分析及安全措施
- 地铁钢结构雨棚施工方案
- 厂区绿化养护合同
- 421年产1亿片头孢氨苄生产车间工艺设计(施施)
- 日本文学史课件
- 胃肠间质瘤诊疗共识
- 初高中政治衔接(课堂)课件
- 福特金牛座说明书
- 蒙台梭利教学法PPT完整全套教学课件
- 幼儿园预防肺结核宣传教育课件
- 2023版押品考试题库必考点含答案
评论
0/150
提交评论