1、第四章概要设计54.1构造数据类型54.2基本运算64.2.1主函数64.2.2输入输出函数64.2.3多项式的相加减6第五章详细分析65.1思路分析65.2具体分析75.2.1主函数7根据流程图可写出主函数的主要语句75.2.2输入输出函数85.2.3 多项式相加95.2.4 多项式相减12第六章运行结果分析156.1 输入输出分析156.2 运行结果分析16第七章结束语167.1心得体会与总结16第八章源代码17参考文献:22第一章课程设计的目的与意义1.1课题设计的目的单链表,循环链表以及双链。(2).熟练运用线性表链式存储的基本运算。(3).能应用循环链表实现一元多项式的相加减。1.2
2、课题设计的意义第二章课题设计的内容和要求2.1 课题设计的内容 利用计算机语言实现一元n次多项式的输入输出及其多项式的相加减并正确输出,并且让别人看得一目了然(即编辑程序界面友好化)。2.2 课题设计的要求(1)程序运行需在Visuai C+的条件下进行(2)熟悉C语言的环境,语句及函数的作用 (3)明确自己课题设计的主题,目的及意义 (4) 熟练掌握线性表链式存储的方式及有关知识 (5) 大量收集资料并整理 (6) 良好的语言组织能力与逻辑思维能力第三章问题分析3.1问题描述已知2个一元多项式,它们的每一项由系数与指数确定。编写程序实现这2个一元n次多项式的相加减,并能正确输出这两个一元n次
3、多项式及加减后的结果。3.2解决途径3.2.1顺序表与链式表的比较(1)基于空间的考虑 当线性表的的长度变化较大,难以估计其存储规模时,宜采用动态链表作为存储结构为好;当线性表的长度变化不大,易于事先确定其大小,为了节约存储空间,宜采用顺序表作为存储结构。(2) 基于时间的考虑 若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;对于频繁进行插入和删除的线性表,宜采用链表做存储结构。若表的插入和删除主要发生在表的首尾端,则采用尾指针表示的单循环链表为宜。(3)基于语言的考虑当线性表的长度不变,仅需改变结点间的相对关系时,静态链表比动态链表可能更方便。基于以上三点考虑
4、,用计算机语言实现一元n次多项式的相加减,应该采用线性表链式存储的循环链表实现。3.2.2构造数据类型 在计算机内,我们用一个结点来存放多项式的一项,为了节约空间,并和书写习惯一致,只需保留非0系数的项。每个结点分系数,指数和指针三个域,如下图 系数 指数 指针coefexpnext图1 多项式结点格式建立两条循环链表A,B编写程序实现指数相同的项相加。具体思想如下: 若p1-exp=p2-exp,则将两个结点中的系数相加,当和不为0时修改结点p1的系数,否则修改结点p2的系数 若p1-expp2-exp,则结点p2所指的结点应是“和多项式”中的一项,将结点p2插入在结点p1之前,且令指针p2
5、在原来的链表上后移。 若p1-expnext,p2=B-next,并生成新的结点p (2)判断p1,p2是否同时非空 (3)若不成了再判断p1,p2的指数是否相等,反之不做 (4)若p1,p2的指数相等,则将p1,p2的系数相加或相减,并改变p1,p2的指针;若p1,p2的指数不相等,则判断p1,p2指数的大小,若p1-exp,将p2的指数及系数赋给p,并使p2向后移一位(如果是相减则将p2的系数取反后再赋给p,指数不变),反之将p1的系数及指数赋给p,并使p1向后移一位,循环运算,直到p1-next=0或p2-next=0,在把没比较完的多项式后面的项直接赋到p的后面。第五章详细分析5.1思
6、路分析(1)主函数 定义所需要的数据类型,并用switchcase语句实现各函数的调用(2)输出函数 判断输出多项式的下一个系数是否为零,不为零再判断系数是否大于零,大于零组输出时在后面加上“+”,否则直接输出(3)多项式相加 定义所需变量,在非空条件下判断指数是否相等,相等则系数相加,否则再判断指数哪个大,将小是赋给p,指针向后移,再判断是否为空,不为零即赋到p的后面(4)多项式相减 定义所需变量,在非空条件下判断指数是否相等,相等则系数相加,否则再判断指数哪个大,将小是赋给p,指针向后移,再判断是否为空,不为零即取反赋到p的后面5.2具体分析5.2.1主函数模块图如下:图2 主函数的模块图
7、根据流程图可写出主函数的主要语句 switch(i) case 0:creatA();break; case 1:creatB(); case 2:p=polyadd(A,B); case 3:printA(A); case 4:printB(B); case 5:printC(p); case 6:p=polyminus(A,B); case 7:printD(p); printf(ntt0:结束ntt1:继续n); scanf(%d,&i); 5.2.2输入输出函数流程图如下根据以上输入输出函数的流程图写出以下主要语句:while(p-next!=NULL) /*判断是否有下一项*/if(
8、p-next-coef0) /*判断下一项的系数是否大于零*/printf(%.2fx%d+,p-coef,p-exp);else %.2fx%dp=p-next; 主要思想是:判断下一项是否为空,不空再判断下一项系数是否大于零,大于零则输出该项并在后面加上“+”,否则直接输出;若下一项为空则直接输出该项。5.2.3 多项式相加 根据以上的思想分析,可画如下流程图 在单链表中,从已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其他结点。而在循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使得某些运算在单循环链表上易于实现。 两个多项式相加的运算规则很简单,即对所有指数
9、相同的项,将其对应系数相加,若和部位零,则构成“和多项式”中的一项,将所有指数不相同的项复制到和多项式中。根据以上流程图以及多项式相加的运算规则和单循环链表的性质可以编写以下主要语句:while(p1&p2) /*判断p1,p2是否有空*/ if(p1-exp) /*判断p1,p2该项的指数是否相等*/ x=p1-coef+p2-coef; /*将p1,p2该项的系数相加,并赋给x*/ if(x!=0) /*判断相加后的系数是否为零*/ p-next=(polynode*)malloc(sizeof(polynode); /*生成心结点*/ p=p- /*改变p的指向*/coef=x; /*将
10、x赋给p的系数*/ exp=p1-exp; /*将p1的指数赋给p的指数*/ p1=p1- /*p1,p2都指向项下一个*/ p2=p2- else p- p=p- if(p1-exp) /*判断p1,p2指数的大小*/coef=p2-exp=p2- /*将p2该项的指数与系数赋给p*/ p2=p2- /移到p2的下一项*/ elsecoef=p1- /*将p1的该项该项的指数与系数赋给p*/ p1=p1- /*移到p1的下一项*/ while(p1!=NULL) /*判断p1是否为空*/ p- p=p-p-coef /*将p1该项的指数与系数赋给p,并指向p1的下一项*/ p1=p1- wh
11、ile(p2!=NULL) /*判断p2是为空*/ p-coef /*将p2该项的指数与系数赋给p,并指向p2的下一项*/p2=p2-5.2.4 多项式相减根据以上的思想分析,可以画如下流程图: 一元n次多项式的减法运算规则,思想与加法一样,因此我们也应该运用循环链表,并一一比较指数的大小。以上流程图,算法分析以及设计思想,可以写出实现多项式相减的主要语句:exp)coef-p2-=0)exp=-p2-=NULL)coef=-p2- p2=p2-第六章 运行结果分析6.1 输入输出分析输入i的值为零时,即建立多项式A,现A=,程序运行后的以下结果:由此可知函数的输入输出是没有问题的,故下面实现
12、多项式的相加减若出现故障值可能是加减本身函数的问题而不是输入输出函数的问题。6.2 运行结果分析根据以上截屏可以看到,多项式的减法的算法程序是正确的,由于加法与减法的思想一致,故编写的算法程序基本一致,而且由算法运行结果可知,加法的程序是正确的。第七章 结束语7.1心得体会与总结(1)进一步掌握了循环链表的作用与基本运算,有关知识,操作以及与顺序表的基本区别和它们在各程序中的优缺点(2)经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。(3)通过直接对链表的操作,加深了对数据结构的理解和认识。并在完成课程设计的过程
13、作主动查阅了相关资料,学到了不少课本上没有的技术知识。(4)编写程序中遇到问题再所难免,应耐心探究其中的原因,从出现问题的地方起,并联系前后程序,仔细推敲,逐个排查,直到最终搞清为止。(5)不仅加深了我对书本知识的掌握程度,而且加强了我对思维能力和耐力。不管是程序编写还是实验报告都需要清晰的思维能力和耐心。第八章 源代码#includestdlib.hpolynode *A,*B,*C,*D;polynode *creatA() polynode *p1,*r; int i,n; A=(polynode*)malloc(sizeof(polynode); A-next=NULL; r=A;请输
14、入A多项式的项数:n); for(i=1;icoef,& r-next=p1; r=p1; r- return A;polynode *creatB() polynode *p2,*r; B=(polynode*)malloc(sizeof(polynode); B- r=B;请输入B多项式的项数: p2=(polynode*)malloc(sizeof(polynode);请输入B的第i项的系数和指数:next=p2; r=p2; return B;void printA(polynode *A) polynode *p1; p1=A- while(p1-0) printf(,p1-coef
15、,p1-void printB(polynode *B) polynode *p2; p2=B- while(p2- if(p2-,p2-coef,p2-void printC(polynode *C) polynode *p=C- while(p- if(p-void printD(polynode *D) polynode *p=D- else polynode *polyadd(polynode *A,polynode *B) polynode *p1,*p2,*p,*C; float x; p=(polynode*)malloc(sizeof(polynode); C=p; while(p1&p2) return C; polynode *polymin
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1