一元多项式的计算数据结构课程设计报告.docx
- 文档编号:6599240
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:19
- 大小:63.52KB
一元多项式的计算数据结构课程设计报告.docx
《一元多项式的计算数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《一元多项式的计算数据结构课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
一元多项式的计算数据结构课程设计报告
数据结构课程
设计报告
一元多项式的计算
——主要用到的结构是链表
班级:
软件092班
姓名:
指导教师:
成绩:
信息工程学院
年月日
摘要
本次试验依据江西理工大学09级数据结构实验要求,较完善的对题目进行了分析,理解和编程,程序思路清晰,考虑全面。
对于此题,应该使用链式存储结构存储多项式的信息,并根据算法用C语言编程。
同时在本书的后面附带了一部分程序源码和对程序的同步解释,为了更直观的对程序的理解,该书还运用了框架图,使读者能够更好地认识程序。
在用C语言编程的时候,要用到的语句主要有函数调用语句,判断语句,输入和输出语句等。
关键词:
一元多项式线性表指数
一元多项式的计算
1.引言
本次课程设计的目的:
是对数据结构所学内容的进一步的理解与巩固,是将计算机课程与实际问题相联接的关键步骤。
通过课程设计,能够提高分析问题、解决问题,从而运用所学知识解决实际问题的能力。
实验环境:
Window2000及以上,c-free所有版本,Turbo2.0
实验的任务要求:
任务:
能够按照指数降序排列建立并输出多项式;
能够完成两个多项式的相加、相减,并将结果输入
要求:
1.完成需求分析
2.画框架图
3.编写算法
4.用C语言编写程序
5.调试
2.需求分析:
建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果
3.概要设计
存储结构:
一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。
基本算法分析与设计:
1.程序的基本功能:
(1)创建两个一元多项式
(2)两个多项式相加,得到一个新的多项式,可以按指数选择排序方式
(3)两个多项式相减,得到一个新的多项式,可以按指数选择排序方式
(4)退出
2.系统总框图
菜单
退出
主函数
各功能函数
链表结构
按指数降序输出
3.定义的函数及说明
compare(terma,term)比较指数
arrange(polynomailpa)由大到小排序
print(polynomailP)输出多项式,求项数
creat(polynomailP,intm)创建并初始化多项式链表
add(polynomailpa,polynomailpb)两多项式相加
sub(polynomailpa,polynomailpb)两多项式相减
4.详细设计
1.由大到小排序
voidarrange(polynomailpa)
{polynomailh=pa,p,q,r;
if(pa==NULL)exit(-2);
for(p=pa;p->next!
=NULL;p=p->next);r=p;
for(h=pa;h->next!
=r;)//小的沉底
{for(p=h;p->next!
=r&&p!
=r;p=p->next)
if(compare(p->next->next->data,p->next->data)==1)
{q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;
}}
}
2两多项式相加
polynomailadd(polynomailpa,polynomailpb)
{polynomails,newp,q,p,r;intj;
p=pa->next;q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{s=(LNode*)malloc(sizeof(LNode));
switch(compare(p->data,q->data))
{case-1:
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s;r=s;
p=p->next;
break;
case0:
s->data.coef=p->data.coef+q->data.coef;
if(s->data.coef!
=0.0)
{s->data.expn=p->data.expn;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
break;
case1:
s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
r->next=s;r=s;
q=q->next;
break;
}//switch
}//while
while(p)
{s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s;r=s;
p=p->next;
}
while(q)
{s=(LNode*)malloc(sizeof(LNode));
s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
r->next=s;r=s;
q=q->next;
}
r->next=NULL;
for(q=newp->next;q->next!
=NULL;q=q->next)
for(p=q;p!
=NULL&&p->next!
=NULL;p=p->next)
if(q->data.expn==p->next->data.expn)
{q->data.coef=q->data.coef+p->next->data.coef;
r=p->next;
p->next=p->next->next;
free(r);
}
arrange(newp);
returnnewp;
}
3两多项式相减
polynomailsub(polynomailpa,polynomailpb)
{polynomails,newp,q,p,r,Q;intj;
p=pa->next;q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{s=(LNode*)malloc(sizeof(LNode));
switch(compare(p->data,q->data))
{case-1:
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s;r=s;
p=p->next;
break;
case0:
s->data.coef=p->data.coef-q->data.coef;
if(s->data.coef!
=0.0)
{s->data.expn=p->data.expn;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
break;
case1:
s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s;r=s;
q=q->next;
break;
}//switch
}//while
while(p)
{s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s;r=s;
p=p->next;
}
while(q)
{s=(LNode*)malloc(sizeof(LNode));
s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s;r=s;
q=q->next;
}
r->next=NULL;
if(newp->next!
=NULL&&newp->next->next!
=NULL)
{for(q=newp->next;q!
=NULL;q=q->next)
for(p=q->next,r=q;p!
=NULL;)
if(q->data.expn==p->data.expn)
{q->data.coef=q->data.coef+p->data.coef;
r->next=p->next;
Q=p;p=p->next;
free(Q);}
else
{r=r->next;
p=p->next;}
}
arrange(newp);
returnnewp;}
5测试结果
1主菜单
2输入两个多项式
3将两多项式进行加减,并退出界面
结果表示程序可行。
6.调试分析
本次实验程序少,功能也存在不足。
1.当在菜单界面,要选择操作时,不选菜单中的操作代号,程序只叫你再次选择,但不会出现字幕提示。
2.准确的说只能实现两个功能就是加减,降次输出是默认,所以本程序只是实现了任务要求,没有考虑到在此基础上拓展功能。
解决之道:
深入学习编程语言,多研读别人写的好的程序,同时多看书。
7.设计体会
1.经过这次课程设计,我对数据结构这门课程有了进一步的理解,对C编程有了一定的提高。
另外也提高了我分析问题、解决问题,从而运用所学知识解决实际问题的能力。
2.通过这次课程设计,我发现了自己平时学数据结构这门课还有很多没有注意到的地方。
虽然说这次的课题顺利完成了,但我对数据结构这门课的学习还没有完成,以后还必须对数据结构进行复习巩固。
3.以前在数据结构这门课上,我学到的仅仅是理论知识,但这次的课程设计让我感受到课上的东西用到实际问题的难处。
在今后对计算机方面知识的学习中,我要注意理论联系实际,这样才可以把学到的东西运用出来,真正的做到学以致用!
8.结束语
感谢我的数据结构老师董跃华在以往的基础课学习中为我打下良好的基础,这是我这次课程设计能够顺利完成的前提。
感谢学校能够给我们提供这么好的机房,使我有地方上网查资料,能够有地方做这次课程设计。
我也很感谢我的同学,我完成我的程序之后,请他们帮我调试,提了不少宝贵的意见,使我的程序有了进一步的完善。
9.参考文献
1)谭浩强《C语言程序设计》(第三版)清华大学出版社
2)严慰敏.《数据结构》(C语言版).清华大学出版社
10.附录
#include
#include
typedefstruct
{floatcoef;//系数
intexpn;//指数
}term;
typedefstructLNode
{termdata;
structLNode*next;
}LNode,*LinkList;
typedefLinkListpolynomail;
intcompare(terma,termb)
{if(a.expn>b.expn)return1;
if(a.expn==b.expn)return0;
if(a.expn elseexit(-2); } voidarrange(polynomailpa) {polynomailh=pa,p,q,r; if(pa==NULL)exit(-2); for(p=pa;p->next! =NULL;p=p->next);r=p; for(h=pa;h->next! =r;) {for(p=h;p->next! =r&&p! =r;p=p->next) if(compare(p->next->next->data,p->next->data)==1) {q=p->next->next; p->next->next=q->next; q->next=p->next; p->next=q; } r=p; }} intprint(polynomailP) {inti; polynomailq; if(P==NULL)printf("无项! \n"); elseif(P->next==NULL)printf("Y=0\n"); else {printf("该多项式为Y=");q=P->next;i=1; if(q->data.coef! =0&&q->data.expn! =0) {printf("%.2fX^%d",q->data.coef,q->data.expn);i++;} if(q->data.expn==0&&q->data.coef! =0) printf("%.2f",q->data.coef); q=q->next; if(q==NULL) {printf("\n");return1;} while (1) {if(q->data.coef! =0&&q->data.expn! =0) {if(q->data.coef>0)printf("+"); printf("%.2fX^%d",q->data.coef,q->data.expn);i++; } if(q->data.expn==0&&q->data.coef! =0) {if(q->data.coef>0)printf("+"); printf("%f",q->data.coef); } q=q->next; if(q==NULL) {printf("\n");break;} } } return1; } polynomailcreat(polynomailP,intm) {polynomailr,q,p,s,Q; inti; P=(LNode*)malloc(sizeof(LNode)); r=P; for(i=0;i {s=(LNode*)malloc(sizeof(LNode)); printf("请输入第%d项的系数和指数: ",i+1); scanf("%f%d",&s->data.coef,&s->data.expn); r->next=s;r=s; } r->next=NULL; if(P->next->next! =NULL) {for(q=P->next;q! =NULL/*&&q->next! =NULL*/;q=q->next) for(p=q->next,r=q;p! =NULL;) if(q->data.expn==p->data.expn) {q->data.coef=q->data.coef+p->data.coef; r->next=p->next; Q=p;p=p->next; free(Q); } else {r=r->next; p=p->next; } } returnP; } polynomailadd(polynomailpa,polynomailpb) {polynomails,newp,q,p,r;intj; p=pa->next;q=pb->next; newp=(LNode*)malloc(sizeof(LNode)); r=newp; while(p&&q) {s=(LNode*)malloc(sizeof(LNode)); switch(compare(p->data,q->data)) {case-1: s->data.coef=p->data.coef; s->data.expn=p->data.expn; r->next=s;r=s; p=p->next; break; case0: s->data.coef=p->data.coef+q->data.coef; if(s->data.coef! =0.0) {s->data.expn=p->data.expn; r->next=s; r=s; } p=p->next; q=q->next; break; case1: s->data.coef=q->data.coef; s->data.expn=q->data.expn; r->next=s;r=s; q=q->next; break; } } while(p) {s=(LNode*)malloc(sizeof(LNode)); s->data.coef=p->data.coef; s->data.expn=p->data.expn; r->next=s;r=s; p=p->next; } while(q) {s=(LNode*)malloc(sizeof(LNode)); s->data.coef=q->data.coef; s->data.expn=q->data.expn; r->next=s;r=s; q=q->next; } r->next=NULL; for(q=newp->next;q->next! =NULL;q=q->next) for(p=q;p! =NULL&&p->next! =NULL;p=p->next) if(q->data.expn==p->next->data.expn) {q->data.coef=q->data.coef+p->next->data.coef; r=p->next; p->next=p->next->next; free(r); } arrange(newp); returnnewp; } polynomailsub(polynomailpa,polynomailpb) {polynomails,newp,q,p,r,Q;intj; p=pa->next;q=pb->next; newp=(LNode*)malloc(sizeof(LNode)); r=newp; while(p&&q) {s=(LNode*)malloc(sizeof(LNode)); switch(compare(p->data,q->data)) {case-1: s->data.coef=p->data.coef; s->data.expn=p->data.expn; r->next=s;r=s; p=p->next; break; case0: s->data.coef=p->data.coef-q->data.coef; if(s->data.coef! =0.0) {s->data.expn=p->data.expn; r->next=s; r=s; } p=p->next; q=q->next; break; case1: s->data.coef=-q->data.coef; s->data.expn=q->data.expn; r->next=s;r=s; q=q->next; break; }//switch }//while while(p) {s=(LNode*)malloc(sizeof(LNode)); s->data.coef=p->data.coef; s->data.expn=p->data.expn; r->next=s;r=s; p=p->next; } while(q) {s=(LNode*)malloc(sizeof(LNode)); s->data.coef=-q->data.coef; s->data.expn=q->data.expn; r->next=s;r=s; q=q->next; } r->next=NULL; if(newp->next! =NULL&&newp->next->next! =NULL) {for(q=newp->next;q! =NULL;q=q->next) for(p=q->next,r=q;p! =NULL;) if(q->data.expn==p->data.expn) {q->data.coef=q->data.coef+p->data.coef; r->next=p->next; Q=p;p=p->next; free(Q);} else {r=r->next; p=p->next;} } arrange(newp); returnnewp;} voidmain() {polynomailpa=NULL,pb=NULL; polynomailp,q; polynomailaddp=NULL,subp=NULL; intn,m; intsign='y'; printf("*****************************************************\n"); printf("***菜单***\n"); printf("***1、创建两个一元多项式***\n"); printf("***2、两多项式相加得一新多项式***\n"); printf("***3、两多项式相减得一新多项式***\n"); printf("***4、退出***\n"); printf("*****************************************************\n"); printf("\n"); while(sign! ='n') {printf("请选择: "); scanf("%d",&n); switch(n) {case1: if(pa! =NULL) {printf("已建立两个一元多项式,请选择其他操作! "); break; } printf("请输入第一个多项式: \n"); printf("要输入几项: "); scanf("%d",&m); while(m==0) {printf("m不能为0,请重新输入m: "); sc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 计算 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)