选猴王 数据结构课程设计.docx
《选猴王 数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《选猴王 数据结构课程设计.docx(8页珍藏版)》请在冰豆网上搜索。
![选猴王 数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/1/20cf3778-e91c-4951-b6e6-3fb96b1e3fcf/20cf3778-e91c-4951-b6e6-3fb96b1e3fcf1.gif)
选猴王数据结构课程设计
计科专业数据结构A课程设计
选猴王
作者姓名:
王显衡
专业、班级:
计科123
学号:
12422003
指导教师:
赵晶
完成日期:
2013年11月17日
大连大学
DalianUniversity
目录
题目描述1
1、算法思想2
2、详细设计2
4调试分析4
5用户使用说明5
6课程设计总结6
参考文献7
题目描述
任务:
一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
输入数据:
输入m,nm,n为整数,n 输出形式:
中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能
1、算法思想
将表中最后一个结点的指针域指向头结点,整个链表形成一个环,构造循环链表‘*L’。
由此,从表中任意一个结点开始,都可以遍历全表。
再用一个for循环来实现从第1开始数,第数到第N个,该猴子就要离开此圈。
如果链表不空的话,用’a’指向开始结点,往后数到第N个结点,就把第N-1个结点与第N+1个结点链在一起,即实现了删除第N个结点。
如此反复,直到L的后继结点是它自己,即圈中只剩最后一只猴子,那么这只猴子就是大王。
2、详细设计
1)、猴子的存放采用链式存储结构,利用循环链表来实现建立的,其表示方法是递归定义的:
typedefstructMnode
{intdata;
structMnode*next;
}Mnode;
根据题目要求,要让这M只猴子顺序围坐一圈,那就得用循环链表,只须将单循环链表的尾指针的NEXT域指向头指针。
它的判空条件是L=L->next=NULL;
(非空表)(空表)
单循环链表
2)、函数voidhzxdw(M,N)读取数据M、N后,然后就根据N的值,用for循环数猴子结点用’a’指向开始结点,往后数到第N个结点,就把第N-1个结点与第N+1个结点链在一起,即实现了删除第N个结点。
如此反复,直到L的后继结点是它自己,即圈中只剩最后一只猴王。
其源代码如下:
voidhzxdw(intm,intn)//猴子选大王
{
Mnode*q,*p,*L,*pre;
inti;
//s作为n的标志
for(i=0;i{
if(i==0)
{
p=(Mnode*)malloc(sizeof(Mnode));
if(!
p)
{
printf("存储空间分配失败!
\n");
exit(0);
}
p->data=i+1;
L=p;
p->next=L;
}
else
{
q=(Mnode*)malloc(sizeof(Mnode));
q->data=i+1;
q->next=L;
p->next=q;
p=q;
}
}
p=L;//从第一个猴子开始报数
while(p!
=p->next)//当p=p->next时表明猴子大王已选出
{
for(i=1;i<=n;i++)
{
if(i==n)
{
q=p;
pre->next=p->next;
p=p->next;
free(q);
}
else
{
pre=p;
p=p->next;
}
}
}
printf("选出的猴王是%d号猴子\n",p->data);
}
本算法只用了两个简单的for循环,所以时间复杂度为O(N+MN-M)。
其中难点是如何实现数到第N就删除它。
4调试分析
程序运行截图如下:
5用户使用说明
用户根据提示输入两个整数,分别代表猴子M总数和报数N。
6课程设计总结
要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。
在此之前,我也以为自己对C语言已经比较懂了,可还是遇到了一系列问题,也学到很多东西。
每一个人都是在失败、尝试、失败、尝试与收获中成长起来的。
我本学识尚浅,无权谈论这些,只是希望能对大家有所警醒,编程之道漫漫无边,吾将上下而求索.当你看着自己把功能一个个实现,把错误一个调试出来,那种感觉给了自己某种安慰,还有自信!
让自己对语言有了更深一层的了解!
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版)。
清华大学出版社,1997.4
附录一***程序代码
#include
#include
typedefstructMnode
{
intdata;
structMnode*next;
}Mnode;
voidhzxdw(intm,intn)//猴子选大王
{
Mnode*q,*p,*L,*pre;
inti;
//s作为n的标志
for(i=0;i{
if(i==0)
{
p=(Mnode*)malloc(sizeof(Mnode));
if(!
p)
{
printf("存储空间分配失败!
\n");
exit(0);
}
p->data=i+1;
L=p;
p->next=L;
}
else
{
q=(Mnode*)malloc(sizeof(Mnode));
q->data=i+1;
q->next=L;
p->next=q;
p=q;
}
}//为猴子编号
p=L;
while(p!
=p->next)//当p=p->next时表明猴子大王已选到
{
for(i=1;i<=n;i++)
{
if(i==n)
{
q=p;
pre->next=p->next;
p=p->next;
free(q);//q->data号猴子出列
}
else
{
pre=p;
p=p->next;
}
}
}
printf("选出的猴王是%d号猴子\n",p->data);
}
intmain()
{
intm,n;
printf("请输入猴子总数m和规定猴子报数n的值(当n或m等于0时程序结束):
\n");
while(scanf("%d%d",&m,&n)&&m&&n)
{
hzxdw(m,n);
printf("请输入猴子总数m和规定猴子报数n的值(当n或m等于0时程序结束):
\n");
}
return0;
}