数据结构课程设计猴子吃桃问题及二叉树.docx
《数据结构课程设计猴子吃桃问题及二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计猴子吃桃问题及二叉树.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课程设计猴子吃桃问题及二叉树
课程设计任务书
理学院数学0902班学生(28)
课程设计课题:
1猴子吃桃问题:
有一群猴子摘了一堆桃子,它们每天都吃当前桃子的一半再多吃一个,到了第10天就剩下一个桃子,用多种方法实现求出原来这群猴子共摘了多少桃子。
要求:
1)采用数组数据结构实现上述求解;
2)采用链式数据结构。
2.实现二叉排序树:
要求:
用顺序表和二叉链表作为数据结构
1)以回车(’\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T;
2)对二叉排序树进行中序遍历,输出结果;
3)输入元素m,查找二叉排序树T,若存在包含m的结点,则删除该结点,并做中序遍历。
否则显示信息“无m这个结点”。
一、课程设计工作日自2012年2月21日至2012年3月2日
二、同组学生:
无
三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时间、主要参考资料等):
课题来源:
教师提供
课题类型:
设计
课题的目的和意义:
通过课程设计了解c语言中结构体的使用以及利用数据结构设计大型程序
主要参考资料:
黄刘生.数据结构.北京:
经济科学出版社,2005
黄杨铭.数据结构.北京:
科学出版社,2001
严蔚敏.数据结构(C语言版)[M].北京:
清华大学出版社.2008.
苏光奎.数据结构导学.北京:
清华大学出版社,2002
XX文库
指导教师签字:
教研室主任签字:
课程设计评审表
理学院数学0902班学生(28)
设计任务完成情况及指导教师评语
答辩情况
评定成绩
成绩:
指导教师签字:
日期:
教研室主任:
院长签字:
日期:
日期:
问题一、猴子吃桃问题
具体程序及运行结果如下:
#include
#include
#include
#defineNULL0
#defineDay9
//**************************************函数声明***********************************************
voidcreat();
voidprint();
voidarray();
voidEnd();
voiddisplay();
voidfanhui();
voiddisplay()
{system("cls");
printf("\n********猴子吃桃子的问题**********\n");
printf("\n**1,用数组数据结构的方法实现。
**\n");
printf("\n**2,用链数据结构的方法实现。
**\n");
printf("\n**3,退出程序。
**\n");
printf("\n**************************************\n");
printf("\n请输入您的选择(1,2,3):
");
}
//*****************************************数组**************************************
voidarray()
{
intA[Day+1];//定义数组
inti;
A[Day]=1;//第十天的桃子数
for(i=Day;i>=1;i--)
A[i-1]=(A[i]+1)*2;
/*第一天的桃子数是第2天桃子数加1后的2倍*/
printf("thetotalofpeachesare%d\n",A[0]);
printf("桃子变化为:
\n");
for(i=0;i<=Day;i++)
printf("第%d天的桃子数为:
%d\n",i+1,A[i]);
}
//********************************链表算法*****************************************
typedefstructlinknode
{
intdata;
structlinknode*next;//链表指针
}node;
node*head;//头结点
voidcreat()//创建链表
{node*p,*s;
intpeaches=1;//第十天时只剩下一个桃子
intday=10;
printf("输入天数");
scanf("%d",&day);
printf("输入第%d天还剩几个桃子:
",day);
scanf("%d",&peaches);
head=(node*)malloc(sizeof(node));
p=head;
while(day>0)
{
s=(node*)malloc(sizeof(node));//分配存属空间
s->data=peaches;//用来存放结点数据
p->next=s;//把结点插入链表中
p=s;
peaches=(peaches+1)*2;//第一天的桃子数是第二天桃子数加后的2倍;
day--;
}
p->next=NULL;
p=head;
head=head->next;//使头指针指向头结点
free(p);//释放指针P
}
voidprint()//输出从这十天每天的桃子数
{node*p;
p=head;
intday=10;
printf("请确定您输入天数:
");
scanf("%d",&day);
while(p&&day>0)
{printf("第%d天的桃子数:
%d个\n",day,p->data);
p=p->next;
day--;
}
}
voidEnd()
{
printf("\n\n\n\n");
printf("\1谢谢观看\1\n");
printf("\n0772900227\n");
printf("\n\n\n\n\n");
}
//******************************************主函数*********************************************
voidmain()
{
flg:
display();
inta;
intb;
scanf("%d",&a);
if(a<1||a>4)
{
//system("cls");
gotoflg;
}
else
switch(a)
{
case1:
system("cls");
printf("\n***********************使用数组的方法:
**********************\n\n\n");
array();
printf("\n\n\n*****************按<0>键返回主菜单!
!
!
按任意数字键退出程序!
!
!
******************\n");
scanf("%d",&b);
if(b==0)
{gotoflg;}
else
system("cls");
End();
break;
case2:
system("cls");
printf("\n***********************使用链表的方法:
********************\n\n\n");
creat();
print();
printf("\n\n\n*****************任意键返回主菜单!
!
!
按'0'退出程序!
!
!
*************************\n");
scanf("%d",&b);
if(b==0)
{gotoflg;}
else
system("cls");
End();
break;
case3:
system("cls");
End();
exit(0);
}
}
#include
#include
#include
#defineNULL0
#defineDay9
//**************************************函数声明***********************************************
voidcreat();
voidprint();
voidarray();
intdigui();
voidEnd();
voiddisplay();
voidfanhui();
voiddisplay()
{system("cls");
printf("\n********猴子吃桃子的问题**********\n");
printf("\n**1,用数组数据结构的方法实现。
**\n");
printf("\n**2,用链数据结构的方法实现。
**\n");
printf("\n**3,退出程序。
**\n");
printf("\n**************************************\n");
printf("\n请输入您的选择(1,2,3):
");
}
//*****************************************数组**************************************
voidarray()
{
intA[Day+1];//定义数组
inti;
A[Day]=1;//第十天的桃子数
for(i=Day;i>=1;i--)
A[i-1]=(A[i]+1)*2;
/*第一天的桃子数是第2天桃子数加1后的2倍*/
printf("thetotalofpeachesare%d\n",A[0]);
printf("桃子变化为:
\n");
for(i=0;i<=Day;i++)
printf("第%d天的桃子数为:
%d\n",i+1,A[i]);
}
//********************************链表算法*****************************************
typedefstructlinknode
{
intdata;
structlinknode*next;//链表指针
}node;
node*head;//头结点
voidcreat()//创建链表
{node*p,*s;
intpeaches=1;//第十天时只剩下一个桃子
intday=10;
printf("输入天数");
scanf("%d",&day);
printf("输入第%d天还剩几个桃子:
",day);
scanf("%d",&peaches);
head=(node*)malloc(sizeof(node));
p=head;
while(day>0)
{
s=(node*)malloc(sizeof(node));//分配存属空间
s->data=peaches;//用来存放结点数据
p->next=s;//把结点插入链表中
p=s;
peaches=(peaches+1)*2;//第一天的桃子数是第二天桃子数加后的2倍;
day--;
}
p->next=NULL;
p=head;
head=head->next;//使头指针指向头结点
free(p);//释放指针P
}
voidprint()//输出从这十天每天的桃子数
{node*p;
p=head;
intday=10;
printf("请确定您输入天数:
");
scanf("%d",&day);
while(p&&day>0)
{printf("第%d天的桃子数:
%d个\n",day,p->data);
p=p->next;
day--;
}
}
voidEnd()
{
printf("\n\n\n\n");
printf("\1谢谢观看\1\n");
printf("\n0772900227\n");
printf("\n\n\n\n\n");
}
//******************************************主函数*********************************************
voidmain()
{
flg:
display();
inta;
intb;
scanf("%d",&a);
if(a<1||a>4)
{
//system("cls");
gotoflg;
}
else
switch(a)
{
case1:
system("cls");
printf("\n***********************使用数组的方法:
**********************\n\n\n");
array();
printf("\n\n\n*****************按<0>键返回主菜单!
!
!
按任意数字键退出程序!
!
!
******************\n");
scanf("%d",&b);
if(b==0)
{gotoflg;}
else
system("cls");
End();
break;
case2:
system("cls");
printf("\n***********************使用链表的方法:
********************\n\n\n");
creat();
print();
printf("\n\n\n*****************任意键返回主菜单!
!
!
按'0'退出程序!
!
!
*************************\n");
scanf("%d",&b);
if(b==0)
{gotoflg;}
else
system("cls");
End();
break;
case3:
system("cls");
End();
exit(0);
}
}
按1:
链式结构:
按2:
输入10天剩余一个桃子,运行的结果为:
2.实现二叉排序树的程序如下:
#include
usingnamespacestd;
classnode
{
public:
node(inti):
data(i),left(NULL),right(NULL){}
voidinorder(node*&root)//中序遍历,符合升序输出
{
if(root!
=NULL)
{
inorder(root->left);
cout<data<<'';
inorder(root->right);
}
}
voidinsert(node*&ptr,intitem)//在查找树中插入元素
{
if(ptr==NULL)
ptr=newnode(item);
elseif(itemdata)
insert(ptr->left,item);
elseinsert(ptr->right,item);
}
node*find(node*&ptr,intitem)//在查找树中查找元素,找到返回所在结点指针,找不到返回空指针。
{
if(ptr==NULL)
returnNULL;
if(ptr->data==item)
returnptr;
elseif(itemdata)
find(ptr->left,item);
elsefind(ptr->right,item);
}
node*&findy(node*&ptr,intitem)//在查找树中查找肯定存在的元素,并返回其引用
{
if(ptr->data==item)
returnptr;
elseif(itemdata)
findy(ptr->left,item);
elsefindy(ptr->right,item);
}
node*rl(){returnleft;}
node*rr(){returnright;}
voiddele(node*&ptr)//删除值为item所在结点
{
if(ptr->rl()==NULL&&ptr->rr()==NULL)
ptr=NULL;
elseif(ptr->rr()==NULL)
ptr=ptr->rl();
else
ptr=ptr->rr();
}
private:
intdata;
node*left;//左孩子结点
node*right;//右孩子结点
};
intmain()
{
intt,i=0,j;
cout<<"输入数字个数(结点个数):
";
cin>>t;
cout<<"输入"<";
cin>>j;
node*x=newnode(j);
for(;i{
cin>>j;
x->insert(x,j);
}
cout<<"中序遍历为:
";
x->inorder(x);//作中序遍历
cout<<"\n输入操作(当输入-1时程序结束):
"<cin>>j;
while(j!
=-1)
{
node*t=x->find(x,j);//定位结点
if(t!
=NULL)
{
node*&y=x->findy(x,j);
x->dele(y);
cout<<"中序遍历为:
";
x->inorder(x);
}
elsecout<<"无"<cout<<"\n输入操作(当输入-1时程序结束):
"<cin>>j;
}
return0;
}
运行结果如下: