数据结构课程设计一元多项式计算Word下载.docx
《数据结构课程设计一元多项式计算Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式计算Word下载.docx(34页珍藏版)》请在冰豆网上搜索。
typedefstructPolynomial{
floatcoef;
//系数
intexpn;
//指数
structPolynomial*next;
//下一个指针
}*Polyn,Polynomial;
//Polyn结构体变量名
2.2模块设计
从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块。
①多项式创建功能
②多项式销毁功能
③多项式输出功能
④多项式的相加功能
⑤多项式的相减功能
⑥多项式的相乘功能
定义并调用的函数有:
voidInsert(Polynp,Polynh);
//将结点p插入链表h
PolynCreatePolyn(Polynhead,intm);
//创建链表(多项式)
voidDestroyPolyn(Polynp);
//销毁
voidPrintPolyn(PolynP);
//输出
PolynAddPolyn(Polynpa,Polynpb);
//a+b
PolynSubtractPolyn(Polynpa,Polynpb);
//a-b
PolynMultiplyPolyn(Polynpa,Polynpb);
//a*b
voidmain()//主函数
系统共分几个模块,每个模块的算法描述及流程图(核心模块)
1.系统模块图(模块划分)
图1系统模块划分图
2.模块流程图及算法描述
1分模块流程图
(1)多项式的创建
(2)多项式的销毁
(3)多项式的输出
(4)多项式的相加
(5)多项式的相减(6)多项式的相乘
②算法描述
(1)多项式的创建
PolynCreatePolyn(Polynhead,intm)
{//建立一个头指针为head、项数为m的一元多项式
//在主程序初始时,先输入的多项式中的项数m、n在这里为m。
主程序中的pa、pb在此为head
inti;
//用来计数
Polynp;
//定义一个p链表
p=head=(Polyn)malloc(sizeof(structPolynomial));
//动态分配空间,建立头结点
head->
next=NULL;
for(i=0;
i<
m;
i++)
{
p=(Polyn)malloc(sizeof(structPolynomial));
//建立新结点以接收数据
printf("
请输入第%d项的系数与指数:
"
i+1);
//上面循环中i从0开始,所以此处为i+1
scanf("
%f%d"
&
p->
coef,&
expn);
Insert(p,head);
//调用Insert函数插入结点p
}
returnhead;
}
(2)多项式的销毁
利用循环逐渐销毁多项式
voidDestroyPolyn(Polynp)//销毁多项式p
{Polynq1,q2;
q1=p->
next;
q2=q1->
while(q1->
next)//利用循环逐渐销毁多项式P
free(q1);
q1=q2;
//指针后移
q2=q2->
free(q1);
(3)多项式的输出
voidPrintPolyn(PolynP)
{//输出多项式
Polynq=P->
intflag=1;
//项数计数器
if(!
q)
{//若多项式为空,输出0
putchar('
0'
);
\n"
return;
}
while(q)//多项式存在
if(q->
coef>
0&
&
flag!
=1)
putchar('
+'
//系数大于0且不是第一项
if(q->
coef!
=1&
q->
=-1)//系数非1或-1的普通情况
{
%g"
q->
coef);
//%g表示使用%e或%f,哪个输出宽度稍短就使用哪一个
expn==1)
putchar('
X'
//若指数为1
else
if(q->
expn)
printf("
X^%d"
//指数不为1
}
else
coef==1)//系数为1的情况
{
putchar('
1'
//指数为0,则为1
if(q->
putchar('
//指数为1则为x
else
printf("
if(q->
coef==-1)//系数为-1的情况
if(!
printf("
-1"
//指数为0,则为-1
else
-X"
//指数为1,则为-x
-X^%d"
}
q=q->
flag++;
//项数加1
利用对a、b两个多项式每一项分模块讨论进行的,如a指数大或者b空,则将a项该节点插入新链c中,若b指数大或者a空,则将b项插入到c中,如若a、b两项指数相等,则合并后再插入到c链中。
PolynAddPolyn(Polynpa,Polynpb)
{//求解并建立多项式a+b,返回其头指针
Polynqa=pa->
Polynqb=pb->
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));
//建立头结点
hc->
headc=hc;
while(qa||qb)
qc=(Polyn)malloc(sizeof(structPolynomial));
switch(compare(qa,qb))
case1:
qc->
coef=qa->
coef;
expn=qa->
expn;
//a的指数大或b为空,把qa赋值给qc
qa=qa->
//qa指向下一个
break;
case0:
{
coef+qb->
//qc等于qa与qb的和
qb=qb->
//qa,qb都分别指向下一个
case-1:
coef=qb->
//b的指数大或a为空,把qb赋值给qc
expn=qb->
//qb指向下一个
}
if(qc->
=0)
next=hc->
//qc插入到hc中去,并重新生成新的hc,到最后实现a与b的和
next=qc;
hc=qc;
else
free(qc);
//当相加系数为0时,释放该结点
returnheadc;
//返回头指针,实现多项式a与b的相加
(5)多项式的相减
利用a-b=a+(-b)来进行的,即只将b系数取反即可。
PolynSubtractPolyn(Polynpa,Polynpb)
{//求解并建立多项式a-b,返回其头指针,将pb的系数取反后调用相加的函数,实现相减功能
Polynh=pb;
Polynp=pb->
Polynpd;
while(p)
{//将pb的系数取反
p->
coef*=-1;
p=p->
//p向后移动
pd=AddPolyn(pa,h);
for(p=h->
p;
p=p->
next)//恢复pb的系数
returnpd;
//返回pd的值,实现a与b两个多项式相减
(6)多项式的相乘
将a中的每一项乘b中的每一项,即系数相乘,指数相加,将它放在新节点中并插入新链h,最后返回链h。
PolynMultiplyPolyn(Polynpa,Polynpb)
{//求解并建立多项式a*b,返回其头指针
Polynhf,pf;
hf=(Polyn)malloc(sizeof(structPolynomial));
hf->
for(;
qa;
qa=qa->
next)
for(qb=pb->
qb;
qb=qb->
pf=(Polyn)malloc(sizeof(structPolynomial));
pf->
coef*qb->
expn+qb->
Insert(pf,hf);
//调用Insert函数以合并指数相同的项
returnhf;
3.测试结果与分析
系统选择界面如图1
图1
输入数据为:
2(enter)
2(pase)3(enter)
8(pase)2(enter)
3(enter)
5(pase)1(enter)
3(pase)6(enter)
7(pase)2(enter)
图2
输出菜单:
如图2
图3
分别输入a,b,c,d,e五个选项
显示结果:
如图4
图4
输入f,结束,显示结果:
如图五
图5
4.课程设计总结
一.程序总结
计算一元多项式加法,其结果取决于多项式的各项系数与指数,因此程序核心是处理两个多项式的系数与指数。
定义结构体将多项式的各项系数与指数存放,定义结构体类型链表为程序的循环控制提供了可能,利用对链表的运算来确定结果多项式的各项系数与次数,同理算出相应的幂数。
链表是在计算机内存中使用一组连续的存储单元保存数据类型和名字相同的变量。
就链表这种数据类型而言,在排列上采用的方法也是按序排放,先存放第一行,接着存放第二行,……,直到所有数据元素被存放。
多项式采用的是链表形式,以牺牲一定的空间提高程序的运行速度和可行性。
采用链式结构存储多项式,用链表结构体的一个域标记多项式的次数,另一个域标记多项式的系数,程序中采用的是m表示最高次系数,进行加法运算时,标记系数域相加即为相加的对应系数,标记指数域相同则表示为同类项。
链表的特性是在中间任意位置添加删除元素的都非常的快,不需要移动其它的元素。
链表顾名思义,要把各个元素链接起来才算撒。
通常链表每一个元素都要保存一个指向下一个元素的指针(单链表)。
二.错误分析
错误产生的原因有很多:
1.函数定义冲突;
2.函数调用错误;
3.符号字母等输入错误;
4.链表的定义错误;
5.变量名重复发生冲突;
6.指针指向发生错误;
7.未释放空空间;
……
错误显示:
如图6
图6
三.收获与体会
本次课程设计,我查找过资料,请教过同学,以及自己的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在程序设计中,我学会了很多学习的方法,而这是日后最实用的,真的是受益匪浅。
本学期的程序设计课程,我锻炼了能力,学到很多东西,比如思考问题的角度也会从多方面着手;
对自己的专业也有自己的想法……在和同学的交流过程中,互动学习,将知识融会贯通。
通过这次课程设计,我对很多的函数有了新的认识,也学会了运用多种函数,我也明白了写软件的基本过程和基本方法。
在程序的设计过程中遇到了很多的困难,在程序一次一次的调试失败下曾经想过要放弃,我最后还是让自己坚持下来,毫不畏惧困难,在同学的帮助与讲解下我总算是顺利的完成了程序的课程设计。
另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。
老师在教学过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。
在这几天的编写过程中我对语言有了更进一步的认识和了解,也感受到了编程给我带来的快乐与充实,明白了想成为一个合格的甚至是优秀的程序员,我还需要更多更难的锻炼。
所以我还要不断地学习不断地学习,不断地成长。
1.严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,1997
2.朱战立.数据结构.西安:
西安电子科技大学出版社,2004
3.严蔚敏,吴伟民.数据结构题集(C语言版).北京:
清华大学出版社,2000
源程序清单
#include<
stdio.h>
malloc.h>
stdlib.h>
//定义多项式数据结构
intcompare(Polyna,Polynb);
//比较a,b的指数大小,为下面a+b做铺垫
/***************主函数*******************/
voidmain()
{
intm,n,a,x;
charflag;
Polynpa=0,pb=0,pc;
//system("
colorF5"
//字体颜色
system("
color5F"
//背景颜色
**********************************WELCOME*******************************\n\n"
**********************【欢迎使用简便式一元多项式计算程序】********************\n\n"
******************************************************************************\n\n"
*****【使用说明:
您可建立a,b两个多项式,并进行相加、相减、相乘三种运算】******\n\n"
********************【请按以下提示请输入您所需的数据】************************\n\n"
请输入a的项数:
%d"
m);
pa=CreatePolyn(pa,m);
//建立多项式a
请输入b的项数:
n);
pb=CreatePolyn(pb,n);
//建立多项式b
cls"
printf("
*******************************************************************************\n"
*******************************A.【输出多项式a】******************************\n"
*******************************B.【输出多项式b】******************************\n"
*******************************C.【输出a+b】******************************\n"
*******************************D.【输出a-b】******************************\n"
*******************************E.【输出a*b】******************************\n"
*******************************F.【退出程序】******************************\n"
while
(1)
\n请选择操作:
%c"
flag);
//空格符号一定要注意
switch(flag)
{
case'
A'
:
a'
\n多项式a="
PrintPolyn(pa);
break;
B'
b'
\n多项式b="
PrintPolyn(pb);
C'
c'
pc=AddPolyn(pa,pb);
printf("
\na+b="
PrintPolyn(pc);
D'
d'
pc=SubtractPolyn(pa,pb);
\na-b="
E'
e'
pc=MultiplyPolyn(pa,pb);
\na*b="
F'
f'
system("
printf("
\t******************************************************************\n\n"
\t*************************感谢使用此程序*************************\n\n"
\t***************************O(∩_∩)O****************************\n\n"
\t*****************************再见******************************\n\n"
\t***************************MadebyYDH**************************\n\n"
DestroyPolyn(pa);
DestroyPolyn(pb);
return;
default:
\n您的选择错误,请重新选择!
/**