1、滨江学院数据结构课程设计题 目 一元稀疏多项式计算器 学 号 20112346047学生姓名 李海磊院 系 滨江学院计算机系专 业 网络工程 指导教师 宣文霞二一二 年十二 月 十二 日一题目的内容及要求1、基本要求(1)输入并建立多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2, cn,en,其中 n 是多项式的项数,ci,ei,分别是第 i 项的系数和指数,序列按指数降序排序;(3)多项式 a 和 b 相加,建立多项式 a+b;(4)多项式 a 和 b 相减,建立多项式 a-b;2、设计目的数据结构是实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段。课
2、程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用二、 需求分析1、 设计开发环境:软件方面:系统 windows 7 编程软件:VC+ 6.02、思路分析:一般情况下的一元 n 次多项式可写成 pn(x)=p1xe1+p2xe2+pmxem其中,p1 是指数为 ei 的项的非零系数,且满足 0e1#include#includetypedef struct Polynodefloat coef; /系数int exp; /指数struct Polynode *next;*Pol
3、y,Polynode; /Poly 为结点指针类型void Insert(Poly p,Poly head) if(p-coef=0) /系数为0时释放结点free(p); elsePoly q1,q2;q1=head;q2=head-next;while(q2q2=q2-next;if(q2free(p);if(!q2-coef) /系数为0 时释放结点 q1-next=q2-next;free(q2);else p-next=q2;q1-next=p;/InsertPoly CreateList(Poly head,int m) /建立一个头指针为 head、项数为 m 的一元多项式int
4、 i;Poly p;Polynode *q;p=head=(Poly)malloc(sizeof(struct Polynode);head-next=NULL;for(i=0;ip-coefp-exp;Insert(p,head); /调用 Insert 函数插入结点q=head-next;while(q!=NULL)coutcoefexpnext;return head;/CreatePolyvoid DestroyList(Poly p) /销毁多项式 pPoly q1,q2;if(p-next!=NULL)q1=p-next;q2=q1-next;while(q1-next)free(
5、q1);q1=q2;/指针后移q2=q2-next;int OutputList(Poly P) /输出多项式Poly q=P-next; int flag=1;/项数计数器if(!q) /若多项式为空,输出 0coutcoef0 if(q-exp=1) coutexp) coutexp;elseif(q-coef=1)if(!q-exp)coutexp=1) coutexp) coutexp;if(q-coef=-1)if(!q-exp) coutexp=1) coutexp;q=q-next; flag+;/whilecoutexpb-exp) return 1;else if(!a|a-
6、expexp) return -1;else return 0;else if(!a/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 Polynode);/建立头结点hc-next=NULL;headc=hc;while(qa|qb)qc=(Poly)malloc(sizeo
7、f(struct Polynode);switch(compare(qa,qb)case 1:qc-coef=qa-coef;qc-exp=qa-exp;qa=qa-next;break;case 0: qc-coef=qa-coef+qb-coef;qc-exp=qa-exp;qa=qa-next;qb=qb-next;break;case -1:qc-coef=qb-coef;qc-exp=qb-exp;qb=qb-next;break; /switchif(qc-coef!=0)qc-next=hc-next;hc-next=qc;hc=qc;else free(qc);/当相加系数为
8、0时,释放该结点/whilereturn headc;/AddPolyPoly SubtractPoly(Poly pa,Poly pb)/求解并建立和多项式 a-b,返回其头指针Poly qa=pa-next;Poly qb=pb-next;Poly headc,hc,qc;hc=(Poly)malloc(sizeof(struct Polynode);/建立头结点hc-next=NULL;headc=hc;while(qa|qb)qc=(Poly)malloc(sizeof(struct Polynode);switch(compare(qa,qb)case 1:qc-coef=qa-co
9、ef;qc-exp=qa-exp;qa=qa-next;break;case 0: qc-coef=qa-coef-qb-coef;qc-exp=qa-exp;qa=qa-next;qb=qb-next;break;case -1:qc-coef=-qb-coef;qc-exp=qb-exp;qb=qb-next;break; /switchif(qc-coef!=0)qc-next=hc-next;hc-next=qc;hc=qc;else free(qc);/当相减系数为 0时,释放该结点/whilereturn headc;/AddPolyPoly MultiplyPoly(Poly p
10、a,Poly pb)/求解并建立积多项式 a*b,返回其头指针Poly hf,pf;Poly qa=pa-next;Poly qb=pb-next;hf=(Poly)malloc(sizeof(struct Polynode);/建立头结点hf-next=NULL;for(qa=pa-next;qa;qa=qa-next)for(qb=pb-next;qb;qb=qb-next)pf=(Poly)malloc(sizeof(struct Polynode);pf-coef=qa-coef*qb-coef;pf-exp=qa-exp+qb-exp;Insert(pf,hf);/调用 Insert
11、 函数以合并指数相同的项return hf;/MultiplyPolyvoid DevicePoly(Poly pa,Poly pb)/求解并建立商多项式 a/b,返回其头指针Poly hf,pf,temp1,temp2;Poly qa=pa-next;Poly qb=pb-next;hf=(Poly)malloc(sizeof(struct Polynode);/建立头结点,存储商hf-next=NULL;pf=(Poly)malloc(sizeof(struct Polynode);/建立头结点,存储余数pf-next=NULL;temp1=(Poly)malloc(sizeof(stru
12、ct Polynode);temp1-next=NULL;temp2=(Poly)malloc(sizeof(struct Polynode);temp2-next=NULL;temp1=AddPoly(temp1,pa);while(qa!=NULLtemp2-next-coef=(qa-coef)/(qb-coef);temp2-next-exp=(qa-exp)-(qb-exp);Insert(temp2-next,hf);pa=SubtractPoly(pa,MultiplyPoly(pb,temp2);qa=pa-next;temp2-next=NULL;pf=SubtractPol
13、y(temp1,MultiplyPoly(hf,pb);coutnext;p;p=p-next)t=1;for(i=p-exp;i!=0;)if(icoef*t;return sum;/ValuePolyPoly Derivative(Poly head)/求解并建立 a 的导函数多项式,并返回其头指针Poly q=head-next,p1,p2,hd;hd=p1=(Poly)malloc(sizeof(struct Polynode);/建立头结点hd-next=NULL;while(q)if(q-exp!=0) /该项不是常数项 时p2=(Poly)malloc(sizeof(struct
14、 Polynode);p2-coef=q-coef*q-exp;p2-exp=q-exp-1;p2-next=p1-next;/尾插法插入结点p1-next=p2;p1=p2; else if(q-exp=0) /该项为常数项break; q=q-next;return hd;/Dervativeint main()int m,n,flag=0;float x;Poly pa=0,pb=0,pc,pd,pe,pf;/定义各式的头指针,pa 与 pb 在使用前付初值 NULLcoutm;pa=CreateList(pa,m);/建立多项式 acoutn;pb=CreateList(pb,n);/
15、建立多项式 a/输出菜单coutflag;if(flag=1)coutx;cout5) cout“输入错误!请重新选择 !“;continue;DestroyList(pa);DestroyList(pb);return 0;6、 六、运行结果及分析测试软件:Microsoft Visual C+ 6.0测试的数据: (x+x3)+(-x-x3)=0七、 收获及体会学完数据结构线性表一章后做此题,自觉就想到用带头结点的单链表来存储多项式,只需用结点记录多项式的系数和指数,此数据结构即节省空间又好进行操作,且进行运算的主要设计思路也易想到,大体设计结构在较短时间内能够完成。但当设计到具体细节代码
16、时遇到了不少困难,主要困难是进行结点操作时,对指针考虑得不够细致,调试时常出现指针指错的情况,没有认真理清条件层次。完成此程序后,受益匪浅,它巩固了线性表一章学到的知识,而且重温了函数传参等重点知识。尽管对程序进行大量的调试分析修改,可还有些代码写得十分啰嗦,程序也不够健壮,对多项式的操作只限于 2 个多项式,还有在界面设计上没花太大心思,界面不美观。这些问题在日后还需进行改善。本次课程设计采用 C+语言实现.这次设计基本上能实现指导书上的要求。我们可以通过这个程序实现计算器的一些基本功能,实现相关操作。通过本次课程设计,让我进一步了解了 c+的一些知识,C+的字符串处理功能完全依靠字符串数组
17、来实现,很多在其他高级语言中实现的字符串比较等操作,在这里完全依靠函数来实现,因此调试中字符串处理函数的调试很多本次课程设计培养了我们对这些实际问题的分析能力以及解决一些实际问题的能力。通过编程,巩固了我们对编程思想和写程序的能力。课程设计是对我们的学习很有利的一个环节。在这个阶段,我们学会把理论与实际的结合、懂得人与人沟通的重要性,明白合作的可贵。当然,在编写的过程中也出现了很多问题,但通过调试和看书解决了,大大的提高了我自学的能力,学会了遇到问题,如何利用资源去解决问题也明白了要完成一项设计,首先要有扎实的基础知识,这就要求我们在平时的学习中要不断提高自己。其次,要充分利用身边的各种资源,图书馆有很多相关的书,网上也有不少的知识解答,要好好的利用。第三,要多向身边的同学多请教,在交流中提高自己的实力。理论联系实践,在实践中提高。通过这次课程设计中,我加深了对课本知识的理解。