数据结构基于线性表链式存储实现一元多项式加减课程研究设计实验报告.docx
- 文档编号:4301579
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:29
- 大小:224.08KB
数据结构基于线性表链式存储实现一元多项式加减课程研究设计实验报告.docx
《数据结构基于线性表链式存储实现一元多项式加减课程研究设计实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构基于线性表链式存储实现一元多项式加减课程研究设计实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构基于线性表链式存储实现一元多项式加减课程研究设计实验报告
数据结构课程设计
设计题目:
基于线性表链式存储实现一元多项式加减
课题名称
基于线性表的链式存储实现一元多项式的相加减
姓名
成绩
课题设计
目的与
设计意义
1、课题设计目的:
(1).熟练掌握线性表链式存储基本的存储形式:
单链表,循环链表以及双链表
(2).熟练运用线性表链式存储的基本运算
(3).能应用循环链表实现一元多项式的相加减
(4).将一元多项式相加减的思想利用C语言编写程序在计算机上实现
2、课题设计意义:
(1).进一步了解循环链表的特点:
无须增加存储量,仅对表的连接方式稍作改变,即可使得表处理更加方面灵活
(2).学会将数学语言转化为计算机语言
(3).懂得课程设计的格式及要求,有利于以后写毕业论文
(4).耐心,细心以及广泛的材料收集的成功的前提
指导教师:
年月日
目录
第一章.课程设计的目的与意义4
1.1课题设计的目的4
1.2课题设计的意义4
第二章.课题设计的内容和要求4
2.1课题设计的内容4
2.2课题设计的要求4
第三章.问题分析4
3.1问题描述4
3.2解决途径5
3.2.1顺序表与链式表的比较5
3.2.2构造数据类型5
第四章.概要设计5
4.1构造数据类型5
4.2基本运算6
4.2.1主函数6
4.2.2输入输出函数6
4.2.3多项式的相加减6
第五章.详细分析6
5.1思路分析6
5.2具体分析7
5.2.1主函数7
根据流程图可写出主函数的主要语句7
5.2.2输入输出函数8
5.2.3多项式相加9
5.2.4多项式相减12
第六章运行结果分析15
6.1输入输出分析15
6.2运行结果分析16
第七章结束语16
7.1心得体会与总结16
第八章源代码17
参考文献:
22
第一章.课程设计的目的与意义
1.1课题设计的目的
(1).熟练掌握线性表链式存储基本的存储形式:
单链表,循环链表以及双链。
(2).熟练运用线性表链式存储的基本运算。
(3).能应用循环链表实现一元多项式的相加减。
(4).将一元多项式相加减的思想利用C语言编写程序在计算机上实现
1.2课题设计的意义
(1).进一步了解循环链表的特点:
无须增加存储量,仅对表的连接方式稍作改变,即可使得表处理更加方面灵活
(2).学会将数学语言转化为计算机语言
(3).懂得课程设计的格式及要求,有利于以后写毕业论文
(4).耐心,细心以及广泛的材料收集的成功的前提
第二章.课题设计的内容和要求
2.1课题设计的内容
利用计算机语言实现一元n次多项式的输入输出及其多项式的相加减并正确输出,并且让别人看得一目了然(即编辑程序界面友好化)。
2.2课题设计的要求
(1)程序运行需在VisuaiC++的条件下进行
(2)熟悉C语言的环境,语句及函数的作用
(3)明确自己课题设计的主题,目的及意义
(4)熟练掌握线性表链式存储的方式及有关知识
(5)大量收集资料并整理
(6)良好的语言组织能力与逻辑思维能力
第三章.问题分析
3.1问题描述
已知2个一元多项式,它们的每一项由系数与指数确定。
编写程序实现这2个一元n次多项式的相加减,并能正确输出这两个一元n次多项式及加减后的结果。
3.2解决途径
3.2.1顺序表与链式表的比较
(1)基于空间的考虑
当线性表的的长度变化较大,难以估计其存储规模时,宜采用动态链表作为存储结构为好;当线性表的长度变化不大,易于事先确定其大小,为了节约存储空间,宜采用顺序表作为存储结构。
(2)基于时间的考虑
若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;对于频繁进行插入和删除的线性表,宜采用链表做存储结构。
若表的插入和删除主要发生在表的首尾端,则采用尾指针表示的单循环链表为宜。
(3)基于语言的考虑
当线性表的长度不变,仅需改变结点间的相对关系时,静态链表比动态链表可能更方便。
基于以上三点考虑,用计算机语言实现一元n次多项式的相加减,应该采用线性表链式存储的循环链表实现。
3.2.2构造数据类型
在计算机内,我们用一个结点来存放多项式的一项,为了节约空间,并和书写习惯一致,只需保留非0系数的项。
每个结点分系数,指数和指针三个域,如下图
系数指数指针
coef
exp
next
图1多项式结点格式
建立两条循环链表A,B编写程序实现指数相同的项相加。
具体思想如下:
①若p1->exp==p2->exp,则将两个结点中的系数相加,当和不为0时修改结点p1的系数,否则修改结点p2的系数
②若p1->exp>p2->exp,则结点p2所指的结点应是“和多项式”中的一项,将结点p2插入在结点p1之前,且令指针p2在原来的链表上后移。
③若p1->exp
第四章.概要设计
4.1构造数据类型
根据上面的解决途径可以对指数,系数及指针进行以下说明:
typedefstructpnode
{
intexp;/*指数*/
floatcoef;/*系数*/
structpnode*next;
}polynode;
4.2基本运算
4.2.1主函数
(1)功能:
进入程序,并实现函数调用
(2)数据流入:
要输入控制调用函数的序号和是否介绍数字
(3)测试要点:
输入的数字能否调用对应的函数
思想:
(1)用输入的i控制菜单
(2)根据输入的i对函数进行调用
(3)利用菜单实现对程序的控制以及运算的先后顺序
(4)再次利用输入的i选择程序是否结束
4.2.2输入输出函数
(1)功能:
将要进行相加减的一元n次多项式输入输出
(2)数据流入:
要输入的多项式的系数与指数。
(3)数据流出:
合并同类项后的多项式。
(4)测试要点:
输入的多项式是否正确,若输入错误则重新输入
思想:
(1)首先判断输出的多项式的下一个系数是否为零
(2)如果不为,判断系数是否大于零;则就输出这一项
(3)如果系数大于零,则输出这一项并在后面加“+”;否则直接输出这一项
(4)该项输出后,将指针指向下一个
4.2.3多项式的相加减
(1)功能:
实现输入的一元n次多项式的相加减
(2)测试要点:
进行加减运算后(即合并同类项后)的多项式是否正确
思想:
(1)将p1=A->next,p2=B->next,并生成新的结点p
(2)判断p1,p2是否同时非空
(3)若不成了再判断p1,p2的指数是否相等,反之不做
(4)若p1,p2的指数相等,则将p1,p2的系数相加或相减,并改变p1,p2的指针;若p1,p2的指数不相等,则判断p1,p2指数的大小,若p1->exp>p2->exp,将p2的指数及系数赋给p,并使p2向后移一位(如果是相减则将p2的系数取反后再赋给p,指数不变),反之将p1的系数及指数赋给p,并使p1向后移一位,循环运算,直到p1->next=0或p2->next=0,在把没比较完的多项式后面的项直接赋到p的后面。
第五章.详细分析
5.1思路分析
(1)主函数定义所需要的数据类型,并用switch~case语句实现各函数的调用
(2)输出函数判断输出多项式的下一个系数是否为零,不为零再判断系数是否大于零,大于零组输出时在后面加上“+”,否则直接输出
(3)多项式相加定义所需变量,在非空条件下判断指数是否相等,相等则系数相加,否则再判断指数哪个大,将小是赋给p,指针向后移,再判断是否为空,不为零即赋到p的后面
(4)多项式相减定义所需变量,在非空条件下判断指数是否相等,相等则系数相加,否则再判断指数哪个大,将小是赋给p,指针向后移,再判断是否为空,不为零即取反赋到p的后面
5.2具体分析
5.2.1主函数
模块图如下:
图2主函数的模块图
根据流程图可写出主函数的主要语句
switch(i)
{
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);
}
5.2.2输入输出函数
流程图如下
根据以上输入输出函数的流程图写出以下主要语句:
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);
主要思想是:
判断下一项是否为空,不空再判断下一项系数是否大于零,大于零则输出该项并在后面加上“+”,否则直接输出;若下一项为空则直接输出该项。
5.2.3多项式相加
根据以上的思想分析,可画如下流程图
在单链表中,从已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其他结点。
而在循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使得某些运算在单循环链表上易于实现。
两个多项式相加的运算规则很简单,即对所有指数相同的项,将其对应系数相加,若和部位零,则构成“和多项式”中的一项,将所有指数不相同的项复制到和多项式中。
根据以上流程图以及多项式相加的运算规则和单循环链表的性质可以编写以下主要语句:
while(p1&&p2)/*判断p1,p2是否有空*/
{
if(p1->exp==p2->exp)/*判断p1,p2该项的指数是否相等*/
{
x=p1->coef+p2->coef;/*将p1,p2该项的系数相加,并赋给x*/
if(x!
=0)/*判断相加后的系数是否为零*/
{
p->next=(polynode*)malloc(sizeof(polynode));/*生成心结点*/
p=p->next;/*改变p的指向*/
p->coef=x;/*将x赋给p的系数*/
p->exp=p1->exp;/*将p1的指数赋给p的指数*/
}
p1=p1->next;/*p1,p2都指向项下一个*/
p2=p2->next;
}
else
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
if(p1->exp>p2->exp)/*判断p1,p2指数的大小*/
{
p->coef=p2->coef;
p->exp=p2->exp;/*将p2该项的指数与系数赋给p*/
p2=p2->next;/移到p2的下一项*/
}
else
{
p->coef=p1->coef;
p->exp=p1->exp;/*将p1的该项该项的指数与系数赋给p*/
p1=p1->next;/*移到p1的下一项*/
}
}
}
while(p1!
=NULL)/*判断p1是否为空*/
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=p1->coef/*将p1该项的指数与系数赋给p,并指向p1的下一项*/
p->exp=p1->exp;
p1=p1->next;
}
while(p2!
=NULL)/*判断p2是为空*/
{
p->next=(polynode*)malloc(sizeof(polynode));
p=p->next;
p->coef=p2->coef/*将p2该项的指数与系数赋给p,并指向p2的下一项*/
p->exp=p2->exp;
p2=p2->next;
}
5.2.4多项式相减
根据以上的思想分析,可以画如下流程图:
一元n次多项式的减法运算规则,思想与加法一样,因此我们也应该运用循环链表,并一一比较指数的大小。
以上流程图,算法分析以及设计思想,可以写出实现多项式相减的主要语句:
while(p1&&p2)/*判断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
{
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;
}
第六章运行结果分析
6.1输入输出分析
输入i的值为零时,即建立多项式A,现A=
程序运行后的以下结果:
由此可知函数的输入输出是没有问题的,故下面实现多项式的相加减若出现故障值可能是加减本身函数的问题而不是输入输出函数的问题。
6.2运行结果分析
根据以上截屏可以看到,多项式的减法的算法程序是正确的,由于加法与减法的思想一致,故编写的算法程序基本一致,而且由算法运行结果可知,加法的程序是正确的。
第七章结束语
7.1心得体会与总结
(1)进一步掌握了循环链表的作用与基本运算,有关知识,操作以及与顺序表的基
本区别和它们在各程序中的优缺点
(2)经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。
(3)通过直接对链表的操作,加深了对数据结构的理解和认识。
并在完成课程设计的过程作主动查阅了相关资料,学到了不少课本上没有的技术知识。
(4)编写程序中遇到问题再所难免,应耐心探究其中的原因,从出现问题的地方起,并联系前后程序,仔细推敲,逐个排查,直到最终搞清为止。
(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);
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
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)
{
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
{
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;
}
polynode*polymin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 基于 线性 表链 存储 实现 一元 多项式 加减 课程 研究 设计 实验 报告