数据结构课程设计多项式及猴子吃桃问题.docx
- 文档编号:10843835
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:28
- 大小:56.30KB
数据结构课程设计多项式及猴子吃桃问题.docx
《数据结构课程设计多项式及猴子吃桃问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计多项式及猴子吃桃问题.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构课程设计多项式及猴子吃桃问题
天津职业技术师范大学
课程设计任务书
理学院数学0902班学生邓吉利(0772*******)
课程设计课题:
第一题:
在顺序结构、动态链表结构下实现一元多项式的加法、减法、乘法运算。
设有一元多项式
和
请实现求:
要求:
1)首先判定多项式是否稀疏;
2)分别采用顺序和动态存储结构实现;
3)结果
中无重复阶项、无零系数项;
4)要求输出结果的升幂和降幂两种排列情况。
第二题:
猴子吃桃问题:
有一群猴子摘了一堆桃子,它们每天都吃当前桃子的一半再多吃一个,到了第10天就剩下一个桃子,用多种方法实现求出原来这群猴子共摘了多少桃子。
要求:
1)采用数组数据结构实现上述求解;
2)采用链式数据结构。
一、课程设计工作日自2012年2月21日至2012年3月2日
二、同组学生:
无。
三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时间、主要参考资料等):
课题来源:
教师提供
课题类型:
设计
目的和意义:
通过数据结构课程设计掌握在C语言中结构体的建立和使用,并能用合适的数据结构设计大型程序
完成时间:
2012年2月29日
主要参考资料:
[1]严蔚敏.数据结构(C语言版).清华大学出版社,2007
[2]严蔚敏.数据结构题集(C语言版).清华大学出版社,2007
[3]谭浩强.C语言程序设计.清华大学出版社,2005
[4]与所用编程环境相配套的C语言或C++相关的资料
指导教师签字:
教研室主任签字:
2012年2月29日
天津职业技术师范大学
课程设计评审表
理学院数学0902班学生邓吉利
设计任务完成情况及指导教师评语
答辩情况
评定成绩
成绩:
指导教师签字:
日期:
教研室主任:
院长签字:
日期:
日期:
一、设计分析
1.顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。
可以分为几个模块:
输入模块、输出模块(升幂降幂)、数据处理模块(多项式的加减乘)、主程序模块。
2.在程序过程中加入汉字提示符,让读者清楚明白的操作该程序。
运行程序时看起来简洁有序,操作简单明了。
3.程序执行时的命令:
①选择创建两个一元多项式②输入第一个一元多项式的项数③依次输入一元多项式的系数和指数④以相同方式输入第二个一元多项式⑤选择操作方式⑥选择降幂或升幂排序⑦输出结果⑧是否退出
4.测试数据。
输入的一元多项式系数指数分别为70,31,98,517和81,227,-98。
加法结果为;升幂降幂
减法结果为:
升幂降幂
乘法结果为:
升幂降幂
二、具体设计概要
1、数据结构的设计
在该程序中分别分为顺序存储和链式存储结构。
2、算法的设计
本程序主要分为四大模块
①主程序模块
②输入模块:
通过Getpolyn函数输入
③输出模块(升幂降幂):
PrintPolyn函数实现输出
④数据处理模块(多项式的加减乘):
通过一元多项式的Polynomial基本操作实现
3、抽象数据类型的设计
一元多项式抽象数据类型的定义:
抽象数据类型Polynomial的定义:
三、详细程序设计及运行结果:
第一题
程序及运行结果:
#include
usingnamespacestd;
structterm
{
floatxishu;//系数
intzhishu;//指数
};
structLNode
{
termdata;//term多项式值
structLNode*next;
};
typedefLNode*polynomail;
/*合并同类项*/
polynomailhebing(polynomailHead)
{
polynomailr,q,p,Q;
for(q=Head->next;q!
=NULL;q=q->next)//合并同类项
for(p=q->next,r=q;p!
=NULL;)
if(q->data.zhishu==p->data.zhishu)
{
q->data.xishu=q->data.xishu+p->data.xishu;
r->next=p->next;
Q=p;p=p->next;
deleteQ;
}
else
{
r=r->next;
p=p->next;
}
returnHead;
}
/*由小到大排列*/
voidarrange1(polynomailpa)
{
polynomailh=pa,p,q,r;
for(p=pa;p->next!
=NULL;p=p->next);r=p;
while(h->next!
=r)//大的沉底
{
for(p=h;p->next!
=r&&p!
=r;p=p->next)
if(p->next->data.zhishu>p->next->next->data.zhishu)
{
q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向参与比较的最后一个,不断向前移动
}
}
/*由大到小排序*/
voidarrange2(polynomailpa)
{
polynomailh=pa,p,q,r;
for(p=pa;p->next!
=NULL;p=p->next);r=p;
while(h->next!
=r)//小的沉底
{
for(p=h;p->next!
=r&&p!
=r;p=p->next)
if(p->next->data.zhishu
{
q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向参与比较的最后一个,不断向前移动
}
}
booljudge(polynomailHead)
{
arrange2(Head);
polynomailp;
p=Head->next;
boolxi=false;
while(p!
=NULL&&p->next!
=NULL&&!
xi)
{
if(p->data.zhishu-p->next->data.zhishu>1)
xi=true;
p=p->next;
}
returnxi;
}
/*打印多项式,求项数*/
voidprintpolyn(polynomailP)
{
inti;
polynomailq;
if(P==NULL)
cout<<"无项\n";
elseif(P->next==NULL)
cout<<"Y=0\n";
else
{
cout<<"该多项式为Y=";
q=P->next;
i=1;
if(q->data.xishu!
=0&&q->data.zhishu!
=0)
{
cout<
i++;
}
if(q->data.zhishu==0&&q->data.xishu!
=0)
cout<
q=q->next;
if(q==NULL)
{
cout<<"\n";
return;
}
while
(1)//while中,打印剩下项中系数非零的项,
{
if(q->data.xishu!
=0&&q->data.zhishu!
=0)
{
if(q->data.xishu>0)
cout<<"+";
cout<
i++;
}
if(q->data.zhishu==0&&q->data.xishu!
=0)
{
if(q->data.xishu>0)cout<<"+";
cout<
}
q=q->next;
if(q==NULL)
{
cout<<"\n";
break;
}
}
}
}
/*1、创建并初始化多项式链表*/
polynomailcreatpolyn(intm)
{
polynomailHead,r,s;
inti;
Head=newLNode;
r=Head;
for(i=0;i { s=newLNode; cout<<"请输入第"< "; cin>>s->data.xishu>>s->data.zhishu; r->next=s;r=s; } r->next=NULL; if(m>1) { Head=hebing(Head); } returnHead; } /*2、两多项式相加*/ polynomailaddpolyn(polynomailpa,polynomailpb) { polynomails,newHead,q,p,r;intj; p=pa->next; q=pb->next; newHead=newLNode; r=newHead; while(p) { s=newLNode; s->data.xishu=p->data.xishu; s->data.zhishu=p->data.zhishu; r->next=s;r=s; p=p->next; } while(q) { s=newLNode; s->data.xishu=q->data.xishu; s->data.zhishu=q->data.zhishu; r->next=s;r=s; q=q->next; } r->next=NULL; if(newHead->next! =NULL&&newHead->next->next! =NULL)//合并同类项 newHead=hebing(newHead); cout<<"升序1,降序2\n"; cout<<"选择: "; cin>>j; if(j==1) arrange1(newHead); else arrange2(newHead); returnnewHead; } /*3、两多项式相减*/ polynomailsubpolyn(polynomailpa,polynomailpb) { polynomails,newHead,q,p,r;intj; p=pa->next;q=pb->next; newHead=newLNode; r=newHead; while(p) { s=newLNode; s->data.xishu=p->data.xishu; s->data.zhishu=p->data.zhishu; r->next=s;r=s; p=p->next; } while(q) { s=newLNode; s->data.xishu=-q->data.xishu; s->data.zhishu=q->data.zhishu; r->next=s;r=s; q=q->next; } r->next=NULL; if(newHead->next! =NULL&&newHead->next->next! =NULL)//合并同类项 newHead=hebing(newHead); cout<<"升序1,降序2\n"; cout<<"选择: "; cin>>j; if(j==1) arrange1(newHead); else arrange2(newHead); returnnewHead; } /*4两多项式相乘*/ polynomailmulpolyn(polynomailpa,polynomailpb) { polynomails,newHead,q,p,r; intj; newHead=newLNode; r=newHead; for(p=pa->next;p! =NULL;p=p->next) for(q=pb->next;q! =NULL;q=q->next) { s=newLNode; s->data.xishu=p->data.xishu*q->data.xishu; s->data.zhishu=p->data.zhishu+q->data.zhishu; r->next=s; r=s; } r->next=NULL; cout<<"升序1,降序2\n"; cout<<"选择: "; cin>>j; if(j==1)arrange1(newHead); elsearrange2(newHead); if(newHead->next! =NULL&&newHead->next->next! =NULL)//合并同类项 newHead=hebing(newHead); returnnewHead; } /*5、销毁已建立的两个多项式*/ voiddelpolyn(polynomailpa,polynomailpb) { polynomailp,q; p=pa; while(p! =NULL) { q=p; p=p->next; free(q); } p=pb; while(p! =NULL) { q=p; p=p->next; free(q); } cout<<"两个多项式已经销毁\n"; } voidmain() { polynomailpa=NULL,pb=NULL; polynomailaddp=NULL,subp=NULL,mulp=NULL; intn,m; while (1) { cout<<"1、创建两个一元多项式\n"; cout<<"2、两多项式相加得一新多项式\n"; cout<<"3、两多项式相减得一新多项式\n"; cout<<"4、两多项式相乘得一新多项式\n"; cout<<"5、销毁已建立的两个多项式\n"; cout<<"6、退出\n"; cout<<"请选择: "; cin>>n; switch(n) { case1: if(pa! =NULL) { cout<<"已建立两个一元多项式,请选择其他操作! "; break; } cout<<"请输入第一个多项式: \n"; cout<<"要输入几项: "; cin>>m; while(m==0) { cout<<"m不能为0,请重新输入m: "; cin>>m; } pa=creatpolyn(m); printpolyn(pa); if(judge(pa)) cout<<"该多项式稀疏\n"; else cout<<"该多项式稠密\n"; cout<<"请输入第二个多项式: \n"; cout<<"要输入几项: "; cin>>m; pb=creatpolyn(m); printpolyn(pb); if(judge(pb)) cout<<"该多项式稀疏\n"; else cout<<"该多项式稠密\n"; break; case2: if(pa==NULL) { cout<<"请先创建两个一元多项式! \n"; break; } addp=addpolyn(pa,pb); printpolyn(addp); break; case3: if(pa==NULL) { cout<<"请先创建两个一元多项式! \n"; break; } subp=subpolyn(pa,pb); printpolyn(subp); break; case4: if(pa==NULL) { cout<<"请先创建两个一元多项式! \n"; break; } mulp=mulpolyn(pa,pb); printpolyn(mulp); break; case5: if(pa==NULL) { cout<<"请先创建两个一元多项式! \n"; break; } delpolyn(pa,pb); pa=pb=NULL; break; case6: delpolyn(pa,pb); exit(0); } } } s 第二题 程序及运行结果: publicclassMonkey{ //主函数 publicstaticvoidmain(String[]args){ Listl=newList(); l.array(); l.link(); } } //构成链表的结点定义 publicclassNode{ publicNodenext; publicObjectdata; publicNode(Objectdata,Nodenext){ this.data=data; this.next=next; } } publicclassList{ privateNodeHead=null; privateNodeTail=null; privateNodePointer=null; privateintLength=0; //在当前结点前插入一个结点,并使其成为当前结点 publicvoidinsert(Objectd){ Nodee=newNode(d,null); if(Length==0){ Tail=e; Head=e; }else{ Nodetemp=cursor(); e.next=temp; if(Pointer==null) Head=e; else Pointer.next=e; } Length++; } //将当前结点移出链表,下一个结点成为当前结点,如果移出的结点是最后一个结点,则第一个结点成为当前结点 publicObjectremove(){ Objecttemp; if(Length==0) return0; elseif(Length==1){ temp=Head.data; deleteAll(); } else{ Nodecur=cursor(); temp=cur.data; if(cur==Head) Head=cur.next; elseif(cur==Tail){ Pointer.next=null; Tail=Pointer; reset(); } else Pointer.next=cur.next; Length--; } returntemp; } //返回当前结点的指针 privateNodecursor(){ if(Head==null) returnnull; elseif(Pointer==null) returnHead; else returnPointer.next; } //返回当前结点的值 publicObjectcurrentNode(){ Nodetemp=cursor(); returntemp.data; } publicvoiddeleteAll(){ Head=null; Tail=null; Pointer=null; Length=0; } publicvoidreset(){ Pointer=null; } //链表实现 publicvoidlink(){ ints=0; Lista=newList(); for(inti=1;i<=10;i++){ if(a.Length==9){ s=1; while(a.Length! =0){ s=s*2+2; a.remove(); } System.out.println("链表实现: "); System.out.println("桃子总数: "+s); }elsea.insert(newInteger(i)); } } //数组实现 publicvoidarray(){ inta[]=newint[10]; a[9]=1; for(inti=a.length-2;i>=0;i--){ a[i]=2*a[i+1]+2; } System.out.println("数组实现: "); System.o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 多项式 猴子 问题