数据结构课程设计多项式及猴子吃桃问题.docx

上传人:b****8 文档编号:10843835 上传时间:2023-02-23 格式:DOCX 页数:28 大小:56.30KB
下载 相关 举报
数据结构课程设计多项式及猴子吃桃问题.docx_第1页
第1页 / 共28页
数据结构课程设计多项式及猴子吃桃问题.docx_第2页
第2页 / 共28页
数据结构课程设计多项式及猴子吃桃问题.docx_第3页
第3页 / 共28页
数据结构课程设计多项式及猴子吃桃问题.docx_第4页
第4页 / 共28页
数据结构课程设计多项式及猴子吃桃问题.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

数据结构课程设计多项式及猴子吃桃问题.docx

《数据结构课程设计多项式及猴子吃桃问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计多项式及猴子吃桃问题.docx(28页珍藏版)》请在冰豆网上搜索。

数据结构课程设计多项式及猴子吃桃问题.docx

数据结构课程设计多项式及猴子吃桃问题

天津职业技术师范大学

课程设计任务书

 

理学院数学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.zhishunext->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<data.xishu<<"X^"<data.zhishu;

i++;

}

if(q->data.zhishu==0&&q->data.xishu!

=0)

cout<data.xishu;//打印第一项

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<data.xishu<<"X^"<data.zhishu;

i++;

}

if(q->data.zhishu==0&&q->data.xishu!

=0)

{

if(q->data.xishu>0)cout<<"+";

cout<data.xishu;

}

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1