利用线性表链式存储实现一元多项式相加减课程设计实验报告.docx
《利用线性表链式存储实现一元多项式相加减课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《利用线性表链式存储实现一元多项式相加减课程设计实验报告.docx(17页珍藏版)》请在冰点文库上搜索。
利用线性表链式存储实现一元多项式相加减课程设计实验报告
利用线性表链式存储实现一元多项式相加减课程设计,实验报告
数据结构课程设计
设计题目:
利用线性表链式存储实现一元多项式相加减学生姓名:
专业班级:
指导教师:
完成时间:
信息工程学院信息与计算科学系
课程设计成绩评定表(本科)
课题名称利用线性表链式存储实现一元多项式相加减院系年级专业学号姓名成绩
1、课题设计目的:
了解数据结构与算法的设计方法,独立分析和设计一元多项式
加减的程序编码,通过程序编写掌握软件开发过程的问题分析、系
统设计、程序编码、测试等基本方法和技能,提高综合运用所学的
理论知识和方法独立分析和解决问题的能力,通过这次实践将实际
问题中所涉及的对象在计算机中表示出来并对它们进行处理,掌握
线性表的链式存储如何实现一元多项式的加减。
1、课题设计意义:
课题设计通过完成此次课题,可以了解各种数据结构内在的逻辑关系,讨
论它在计算机中的存储表示,以及在其上进行各种运算时的算法实目的与现,并对算法的效率和优化进行简单的分析和讨论,不仅加强了学
生对于线性表链式存储的理解,也提高了学生的思维能力,促进学设计意义生的综合应用能力和专业素质的提高。
指导教师:
年月日
第一章、课题描述........................................................1
第二章、课题设计目的....................................................1第三章、课题设计意义....................................................1第四章、设计思路.......................................................1第五章、需求分析.......................................................2
概要设计.......................................................2第六章、
6.1、存储结构:
.....................................................2
6.2、基本算法:
.....................................................2
6.2.1、输入输出..................................................2
6.2.2、构造数据类型..............................................3
6.2.3、多项式的加法..............................................4
6.2.4、多项式的减法..............................................4第七章、程序结果及截图..................................................4第八章、算法的时间复杂度及改进..........................................5第九章、总结及心得体会.................................................5第十章、附录............................................................6第十一章、参考文献.....................................................13
第一章、课题描述
能够完成两个或多个多项式的输出,并且实现两个多项式的相加和相减,并且输出结果。
第二章、课题设计目的
了解数据结构与算法的设计方法,独立分析和设计一元多项式加减的程序编码,通过程序编写掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能,提高综合运用所学的理论知识和方法独立分析和解决问题的能力,通过这次实践将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理,掌握线性表的链式存储如何实现一元多项式的加减,通过不断探索程序的算法,不断优化程序,使得学生的知识掌握更加牢固,实践能力加强,也激发了学生对于数据结构这门课的兴趣,为以后这门课的深入研究做了准备,这次实践使同学更加深入了解了数据结构内在的逻辑关系。
第三章、课题设计意义
通过完成此次课题,可以了解各种数据结构内在的逻辑关系,讨论它在计算机中的存储表示,以及在其上进行各种运算时的算法实现,并对算法的效率和优化进行简单的分析和讨论,不仅加强了学生对于线性表链式存储的理解,也提高了学生的思维能力,促进学生的综合应用能力和专业素质的提高,解决了现实生活中复杂繁琐的计算过程,不仅提高了效率,也增加了正确率,学生对于线性表和指针等知识的理解更加深入深刻,也灵活运用了理论知识解决了实际问题,活学活用,加强了学生的实践能力,同时完成作业还需要与同学的讨论,增强了学生的团队合作能力。
第四章、设计思路
这个程序的关键是多项式的创建和排列,以及相加时相同指数的系数相加。
由于多项式拥有指数和系数,所以可以定义一个包含指数系数的结构体,用单链表存储多项式的数据,所以结构体包含next指针。
数据插入时比较两数的指数,按照降序排列,从表头的next开始,直至找到合适的位置,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。
输入完数据后选择计算方式,多项式运算时要循环遍历整个多项式,多项式的每一组数据都要和另一个多项式整组数据相运算(每一个运算值都存储到新建的“多项式”链表中),直至两个多项式都遍历完结束。
1
第五章、需求分析
1(界面输出,提示如何输入数据。
要求先输入多项式的项数。
2(创建多项式。
接收输入的数据,并保存到链表中。
(显示程序的功能表,允许使用者选择运算类型。
3
4(显示已经创建好的多项式。
6(实现加法运算。
7(实现减法运算。
9(清除内存内容,销毁创建的链表,退出程序。
第六章、概要设计
6.1、存储结构:
一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的加减。
6.2、基本算法:
6.2.1、输入输出
(1)功能:
将要进行运算的多项式输入输出。
(2)数据流入:
要输入的多项式的系数与指数。
(3)数据流出:
合并同类项后的多项式。
(4)程序流程图:
多项式输入流程图如图1所示。
(5)测试要点:
输入的多项式是否正确,若输入错误则重新输入。
否则进行运算。
2
开始
申请结点空间
+++++++++++++
+++++++++++++输入多项式的项数++++++++++++++++++++++++++输入多项式各项的系数x,指数y+++输出已输入的多项式否是否输入正确是合并同类项结束图表1输入输出流程图
6.2.2、构造数据类型
根据上面的解决途径可以对指数,系数及指针进行以下说明:
typedefstructpnode{intexp;/*指数*/floatcoef;/*系数*/structpnode*next;}polynode;
3
6.2.3、多项式的加法
(1)功能:
将两多项式相加。
(2)数据流入:
输入函数。
(3)数据流出:
多项式相加后的结果。
(4)程序流程图:
多项式的加法流程图如图2所示。
(5)测试要点:
两多项式是否为空,为空则提示重新输入,否则,进行运算。
6.2.4、多项式的减法
(1)功能:
将两多项式相减。
(2)数据流入:
调用输入函数。
(3)数据流出:
多项式相减后的结果。
(4)程序流程图:
多项式的减法流程图如图3所示。
(5)测试要点:
两多项式是否为空,为空则提示重新输入,否则,进行运算。
第七章、程序结果及截图
4
第八章、算法的时间复杂度及改进
1、算法的时间复杂度:
一元多项式的加法运算的时间复杂度为O(m+n),减法运算的时间复杂度为O(m-n),其中m,n分别表示二个一元多项式的项数。
2、问题和改进思想:
在设计该算法时,出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺省值,不能实现算法。
实现加法时该链表并没有向通常那样通过建立第三个链表来存放运算结果,而是再度利用了链表之一来进行节点的比较插入删除等操作。
为了使输入数据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再进行之后加减运算
第九章、总结及心得体会
此次上机实验应用了线性表实现了一次实际操作,完成了一个一元多项式的简单计算器,不仅对此次编译程序的算法思想有了新的认识,还让我深刻的体会到了线性表的重要性以及其应用的方便,并且对指针加深了印象,应用了书本中的算法思想,对我以后的编译以及完成新的程序有很大的帮助。
通过这次课程设计练习,使我更深刻地理解了,语言的精髓-----指针的使用。
完成整个程序设计有,对指针掌握的更加熟练。
同时通过直接对链表的操作,加深了对数据结构的理解和认识。
并在完成课程设计的过程主动查阅了相关资料,学到了不少课本上没有的技术知识。
经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程
5
序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。
编程是一件枯燥乏味工作,但是只要认真钻研,我们会从中学到很多在课本上学不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。
兴趣是可以培养的,只要坚持下去,面对困难我们总能够找到解决问题的方法。
计算多项式的加、减、乘法运算-----该程序虽然不是很大,这次还是由几位同学合作才完成这一任务。
在这个小组中我是组长,通过分工与合作,使我充分认识到在项目团队开发过程中合作的重要性,也更加理解了沟通协作能力在软件开发行业中的重要性。
另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。
老师在教学过程中表现出来的对学术钻研一丝不苟的精神让我非常有收获。
同样也是老师的严格要求才使得小组成员能够顺利的完成任务。
第十章、附录
#include
#include
typedefstructpnode
{
intexp;
floatcoef;
structpnode*next;
}polynode;
polynode*A,*B,*C,*D;
polynode*creatA()
{
polynode*p1,*r;
inti,n;
A=(polynode*)malloc(sizeof(polynode));
A->next=NULL;
r=A;
printf("请输入A多项式的项数:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p1=(polynode*)malloc(sizeof(polynode));
printf("请输入A的第i项的系数和指数:
",i);
6
scanf("%f%d",&p1->coef,&p1->exp);
r->next=p1;
r=p1;
}
r->next=NULL;
returnA;
}
polynode*creatB()
{
polynode*p2,*r;
inti,n;
B=(polynode*)malloc(sizeof(polynode));
B->next=NULL;
r=B;
printf("请输入B多项式的项数:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p2=(polynode*)malloc(sizeof(polynode));
printf("请输入B的第i项的系数和指数:
",i);
scanf("%f%d",&p2->coef,&p2->exp);
r->next=p2;
r=p2;
}
r->next=NULL;
returnB;
}
voidprintA(polynode*A){
polynode*p1;
p1=A->next;
while(p1->next!
=NULL)
{
if(p1->next->coef>0)
printf("%.2fx^%d+",p1->coef,p1->exp);
else
7
printf("%.2fx^%d",p1->coef,p1->exp);
p1=p1->next;
}
printf("%.2fx^%d",p1->coef,p1->exp);
}
voidprintB(polynode*B)
{
polynode*p2;
p2=B->next;
while(p2->next!
=NULL)
{
if(p2->next->coef>0)
printf("%.2fx^%d+",p2->coef,p2->exp);
else
printf("%.2fx^%d",p2->coef,p2->exp);
p2=p2->next;
}
printf("%.2fx^%d",p2->coef,p2->exp);
}
voidprintC(polynode*C)
{
polynode*p=C->next;
while(p->next!
=NULL)
{
if(p->next->coef>0)
printf("%.2fx^%d+",p->coef,p->exp);
else
printf("%.2fx^%d",p->coef,p->exp);
p=p->next;
}
printf("%.2fx^%d",p->coef,p->exp);}
voidprintD(polynode*D)
{
8
polynode*p=D->next;
while(p->next!
=NULL)
{
if(p->next->coef>0)
printf("%.2fx^%d+",p->coef,p->exp);
else
printf("%.2fx^%d",p->coef,p->exp);
p=p->next;
}
printf("%.2fx^%d",p->coef,p->exp);}
polynode*polyadd(polynode*A,polynode*B)
{
polynode*p1,*p2,*p,*C;
floatx;
p1=A->next;
p2=B->next;
p=(polynode*)malloc(sizeof(polynode));
p->next=NULL;
C=p;
while(p1&&p2)
{
if(p1->exp==p2->exp)
{
x=p1->coef+p2->coef;
if(x!
=0)
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=x;
p->exp=p1->exp;
}
p1=p1->next;
p2=p2->next;
}
else
9
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
if(p1->exp>p2->exp)
{
p->coef=p2->coef;
p->exp=p2->exp;
p2=p2->next;
}
else
{
p->coef=p1->coef;
p->exp=p1->exp;
p1=p1->next;
}
}
}
while(p1!
=NULL)
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=p1->coef;
p->exp=p1->exp;
p1=p1->next;
}
while(p2!
=NULL)
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=p2->coef;
p->exp=p2->exp;
p2=p2->next;
}
p->next=NULL;
returnC;
}
10
polynode*polyminus(polynode*A,polynode*B)
{
polynode*p1,*p2,*p,*D;
floatx;
p1=A->next;
p2=B->next;
p=(polynode*)malloc(sizeof(polynode));
p->next=NULL;
D=p;
while(p1&&p2)
{
if(p1->exp==p2->exp)
{
x=p1->coef-p2->coef;
if(x!
=0)
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=x;
p->exp=p1->exp;
}
p1=p1->next;
p2=p2->next;
}
else
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
if(p1->exp>p2->exp)
{
p->coef=p2->coef;
p->exp=p2->exp;
p2=p2->next;
}
else
{
11
p->coef=p1->coef;
->exp;p->exp=p1
p1=p1->next;
}
}
}
while(p1!
=NULL)
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=p1->coef;
p->exp=p1->exp;
p1=p1->next;
}
while(p2!
=NULL)
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=-p2->coef;
p->exp=p2->exp;
p2=p2->next;
}
p->next=NULL;
returnD;
}
voidmain()
{
polynode*p1,*p2,*p;
inti;
while(i)
{
printf("\t\t0:
创建多项式A\n\t\t1:
创建多项式B\n\t\t2:
多项式A与多项式B相加
\n\t\t3:
输出多项式A\n\t\t4:
输出多项式B\n\t\t5:
输出相加后的多项式C\n\t\t6:
多项式A
与多项式B相减\n\t\t7:
输出相减后的多项式D\n");
scanf("%d",&i);
switch(i)
12
{
case0:
creatA();break;
case1:
creatB();break;
case2:
p=polyadd(A,B);break;
case3:
printA(A);break;
case4:
printB(B);break;
case5:
printC(p);break;
case6:
p=polyminus(A,B);break;
case7:
printD(p);break;
}
printf("\n\t\t0:
结束\n\t\t1:
继续\n");
scanf("%d",&i);
}
}
第十一章、参考文献
[1]唐策善、李龙澍、黄刘生.数据结构——用C语言描述.高等教育出版社[2]孙家启.C语言程序设计教程.合肥工业大学出版社
13