选猴王 数据结构课程设计Word文件下载.docx
《选猴王 数据结构课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《选猴王 数据结构课程设计Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
大连大学
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
输出形式:
中文提示按照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<
m;
i++)//为猴子编号
{
if(i==0)
p=(Mnode*)malloc(sizeof(Mnode));
if(!
p)
printf("
存储空间分配失败!
\n"
);
exit(0);
}
p->
data=i+1;
L=p;
next=L;
else
q=(Mnode*)malloc(sizeof(Mnode));
q->
next=q;
p=q;
p=L;
//从第一个猴子开始报数
while(p!
=p->
next)//当p=p->
next时表明猴子大王已选出
for(i=1;
=n;
i++)
if(i==n)
q=p;
pre->
next=p->
next;
p=p->
free(q);
pre=p;
选出的猴王是%d号猴子\n"
p->
data);
}
本算法只用了两个简单的for循环,所以时间复杂度为O(N+MN-M)。
其中难点是如何实现数到第N就删除它。
4调试分析
程序运行截图如下:
5用户使用说明
用户根据提示输入两个整数,分别代表猴子M总数和报数N。
6课程设计总结
要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。
在此之前,我也以为自己对C语言已经比较懂了,可还是遇到了一系列问题,也学到很多东西。
每一个人都是在失败、尝试、失败、尝试与收获中成长起来的。
我本学识尚浅,无权谈论这些,只是希望能对大家有所警醒,编程之道漫漫无边,吾将上下而求索.当你看着自己把功能一个个实现,把错误一个调试出来,那种感觉给了自己某种安慰,还有自信!
让自己对语言有了更深一层的了解!
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版)。
清华大学出版社,1997.4
附录一***程序代码
#include<
stdio.h>
stdlib.h>
typedefstructMnode
intdata;
}Mnode;
voidhzxdw(intm,intn)//猴子选大王
}//为猴子编号
next时表明猴子大王已选到
//q->
data号猴子出列
}
intmain()
intm,n;
请输入猴子总数m和规定猴子报数n的值(当n或m等于0时程序结束):
while(scanf("
%d%d"
&
m,&
n)&
&
m&
n)
hzxdw(m,n);
return0;