数据结构课程设计一元稀疏多项式简单计数器文档格式.docx
- 文档编号:18951051
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:14
- 大小:134.08KB
数据结构课程设计一元稀疏多项式简单计数器文档格式.docx
《数据结构课程设计一元稀疏多项式简单计数器文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元稀疏多项式简单计数器文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
2)提交课程设计报告
按照具体要求完成课程设计报告,其中包括问题的描述、算法思想、程序实现结果、数据验证和实验总结等部分。
3、课程设计工作进度计划:
时间
设计任务及要求
1-10
搜集学习相关资料,明确实验要求、目的
1-11
分析课题,理清编程思路
1-12
编写程序,修改程序
1-13
代入数据,进行整体调试,运行,再修改
1-14
性能分析,撰写设计说明书
指导教师:
日期:
2011-11-15
教研室主任:
一、问题描述…………………………………………………………………………1
二、算法思想…………………………………………………………………………2
三、数据结构…………………………………………………………………………3
四、设计模块划分……………………………………………………………………4
五、源程序……………………………………………………………………………5
六、算法分析…………………………………………………………………………10
七、运行结果…………………………………………………………………………11
八、设计总结与体会…………………………………………………………………13
参考文献……………………………………………………………………………14
1.问题描述:
一元稀疏多项式简单计数器
基本要求:
(1)输入并建立多项式
n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。
序列按指数降序排列。
测试数据:
(1)(2x+5x8-3.1x11)+(7-5x8+11x9)
(2)(6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15)
(3)(x+x2+x3)+0
(4)(x+x3)-(-x-x-3)
2.算法思想:
(1)建立多项式
一元多项式是由多个项的和组成的,将一元多项式的每个项用一结点表示,该结点中应包括该项的系数、该项的指数、指向下一项的指针,可以用线性表来依次输入各项结点,从而完成多项式链表的建立,为了使原多项式各项顺序不变,故采用尾插法建表。
(2)降幂输出多项式
我们可以先设一个幂指数i为可输入的最大幂指数,然后从首元结点开始顺次查询每一结点的指数和i,若相等则输出该结点,否则,i--,继续从首元结点开始查询,重复上述过程,直到i为可输入的最小幂指数。
这样,就按指数降幂输出了多项式。
多项式的项数统计可以通过头结点的next来实现,若非空,count++,直到结点的指针域为空,这样,count就统计出了项数。
(3)多项式相加
多项式的相加过程,其实就是相同指数的项的系数相加,不同指数的项复制到和多项式中,将结果用降幂输出函数输出。
(4)多项式相减
多项式的相减过程,其实就是相同指数的项的系数相减,对于不同指数的项,若是被减多项式,则将该结点复制输出,若是减多项式,则将该结点的系数变为原系数的相反数输出,将结果用降幂输出函数输出。
3.数据结构:
带头结点单链表抽象数据类型的结点结构定义如下:
typedefstructPolynode//多项式结点
{
intcoef;
//系数
intexp;
//指数
Polynode*next;
}Polynode,*Polylist;
4.模块划分:
(1)带头结点的多项式的建立函数PolylistPolycreate()
(2)带头结点的多项式的降幂输出函数voidprintf(Polylistpoly)
(3)带头结点的多项式的相加函数PolylistPolyadd(Polylista,Polylistb)
(4)带头结点的多项式的相减函数PolylistPolysub(Polylista,Polylistb)
(5)主函数voidmain()
5.源程序:
#include<
stdio.h>
malloc.h>
typedefstructPolyomial
floatcoef;
intexpn;
structPolyomial*next;
}*Poly,Polyomial;
//Poly为结点指针类型
voidInsert(Polyp,Polyh){
if(p->
coef==0)free(p);
//系数为0时释放结点
else{
Polyq1,q2;
q1=h;
q2=h->
next;
while(q2&
&
p->
expn<
q2->
expn){//查找插入位置
q1=q2;
q2=q2->
}
if(q2&
expn==q2->
expn){//将指数相同相合并
q2->
coef+=p->
coef;
free(p);
if(!
coef){//系数为0的话释放结点
q1->
next=q2->
free(q2);
else{//指数为新时将结点插入
p->
next=q2;
next=p;
}//Insert
PolyCreatePoly(Polyhead,intm){//建立一个头指针为head、项数为m的一元多项式
inti;
Polyp;
p=head=(Poly)malloc(sizeof(structPolyomial));
head->
next=NULL;
for(i=0;
i<
m;
i++){
p=(Poly)malloc(sizeof(structPolyomial));
//建立新结点以接收数据
printf("
输入第%d项的系数与指数:
"
i+1);
scanf("
%f%d"
&
coef,&
expn);
Insert(p,head);
//调用Insert函数插入结点
returnhead;
}//CreatePoly
voidDestroyPoly(Polyp){//销毁多项式p
q1=p->
q2=q1->
while(q1->
next){
free(q1);
//指针后移
}
voidPrintPoly(PolyP){
Polyq=P->
intflag=1;
//项数计数器
q){//若多项式为空,输出0
putchar('
0'
);
\n"
return;
}
while(q){
if(q->
coef>
0&
flag!
=1)putchar('
+'
//系数大于0且不是第一项
coef!
=1&
q->
=-1){//系数非1或-1的普通情况
%g"
q->
coef);
expn==1)putchar('
X'
elseif(q->
expn)printf("
X^%d"
coef==1){
expn)putchar('
1'
elseprintf("
coef==-1){
-1"
expn==1)printf("
-X"
-X^%d"
q=q->
flag++;
}//while
}//PrintPoly
intcompare(Polya,Polyb){
if(a&
b){
b||a->
expn>
b->
expn)return1;
elseif(!
a||a->
expn)return-1;
elsereturn0;
a&
b)return-1;
//a多项式已空,但b多项式非空
elsereturn1;
//b多项式已空,但a多项式非空
}//compare
PolyAddPoly(Polypa,Polypb){//求解并建立多项式a+b,返回其头指针
Polyqa=pa->
Polyqb=pb->
Polyheadc,hc,qc;
hc=(Poly)malloc(sizeof(structPolyomial));
//建立头结点
hc->
headc=hc;
while(qa||qb){
qc=(Poly)malloc(sizeof(structPolyomial));
switch(compare(qa,qb)){
case1:
{
qc->
coef=qa->
expn=qa->
expn;
qa=qa->
break;
case0:
{
coef+qb->
qb=qb->
case-1:
coef=qb->
expn=qb->
}//switch
if(qc->
=0){
next=hc->
next=qc;
hc=qc;
elsefree(qc);
//当相加系数为0时,释放该结点
returnheadc;
}//AddPoly
PolySubtractPoly(Polypa,Polypb)
{//求解并建立多项式a+b,返回其头指针
Polyh=pb;
Polyp=pb->
Polypd;
while(p){//将pb的系数取反
coef*=-1;
p=p->
pd=AddPoly(pa,h);
for(p=h->
p;
p=p->
next)//恢复pb的系数
returnpd;
}//SubtractPoly
intmain(){
intm,n,flag=0;
floatx;
Polypa=0,pb=0,pc,pd,pe,pf;
//定义各式的头指针,pa与pb在使用前付初值NULL
输入a的项数:
%d"
m);
pa=CreatePoly(pa,m);
//建立多项式a
输入b的项数:
n);
pb=CreatePoly(pb,n);
//建立多项式b
for(;
;
flag=0){
执行操作"
flag);
if(flag==1){
多项式a:
PrintPoly(pa);
多项式b:
PrintPoly(pb);
continue;
if(flag==2){
pc=AddPoly(pa,pb);
多项式a+b:
PrintPoly(pc);
DestroyPoly(pc);
if(flag==3){
pd=SubtractPoly(pa,pb);
多项式a-b:
PrintPoly(pd);
DestroyPoly(pd);
if(flag==4)break;
if(flag<
1||flag>
4)printf("
Error\n"
}//for
DestroyPoly(pa);
DestroyPoly(pb);
return0;
6.算法分析
建立多项式的时间复杂度为O(n),降幂输出多项式序列算法,由于是对指数做的循环,每次循环都需要从首元结点查找到表尾,假设多项式开始为升幂排列,如x1+x2+x3+x4+……xn,(这里n<
=20)其时间复杂度为n(n+1)/2,若指数不是连续的,则其时间复杂度加上O(n),所以此算法的时间复杂度为O(n2)。
假设a有M项,b有N项,则加法和减法算法的时间复杂度度为M+N,算法中两多项式相加和相减时,a,b均需按升幂顺序输入结点。
7.运行结果:
程序运行结果为:
(4)(x+x3)-(-x-x-3)
8.设计体会与总结
本次程序设计的总体思路明确,易懂,能够清楚的分辨出各模块的功能,利于用户的阅读、了解程序,该程序的执行过程是相当的易于读者使用,它会在每一步都提示用户接下来的输入数据。
当然,本次课程设计还有许多的不足之处,在以后的不断学习当中我还会继续完善这个程序。
在课程设计的过程中,深深地体会到了有算法思想和将此算法写成可执行程序,还是有一段距离的,程序出现错误并不可怕,只要我们肯耐心的去调试,去改进,最后一定会设计出一个比较好的程序。
拿到课题后,我们首先要对要实现的功能以及数据结构有一个初步的规划,这样后边的工作才会顺利进行。
若是在编写或执行程序的过程中遇到了确实解决不了的问题,需要多和同学交流。
通过做本次课程设计,使我收获了很多东西,知识这方面说起,以前觉得不管什么样的题还是编程,只要了解算法的思想就行了,到时候用的时候自然就会发挥出来,可这次的课程设计却告诉我并不是这样的,我在此次课程设计的编程的时候就遇到了这样的问题。
觉得自己了解算法思想就一定能编出来,可是事实却不得不又拿起书来继续研究,继续查找一些相关的资料,与同学老师之间交流,互相学习之后,才将程序基本编写出来,但运行过程又出现了一些问题,需要不断调试,在老师和同学的帮助下,程序最终无误执行出来了。
总体来说,这次数据结构课设让我的编程能力有了进一步提高,我会继续努力提升自己的素养,为自己的未来做更多的积淀。
当然,在以后的学习过程中我也会吸取前面的教训,在学习好课本知识的同时努力探索课外的相关知识,并且理论与实践结合起来,去检验对理论理解的不足之处,能够及时做到查漏补缺。
还有在以后的学习生活中我会更注意与同学老师间的交流,拓展视野,互相学习,共同进步。
参考文献:
【1】《数据结构———C语言描述》耿国华高等教育出版社2005年7月
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 一元 稀疏 多项式 简单 计数器