数据结构约瑟夫环问题的课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计与内容要求
约瑟夫环问题
[问题描述]
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
[基本要求]
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。
[测试数据]
m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=则正确的输出是什么?
[要求]:
输入数据:首先输入待处理人员数及他们的密码,然后输入m的初值,建立单循环链表。
输出形式:建立一个输出函数,将正确的出列序列输出。
一问题描述与分析
约瑟夫问题
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
分析
利用单循环链表解决本问题,先创建一个有n个的单循环链表,依次录入密码。然后从第一个结点出发,连续略过 m-1个结点,将第m个结点从链表中删除,并将第m个结点的密码作为新的么值,接着从下个结点开始,循环此过程,直至链表为空。
二数据结构描述
利用不带头结点的单循环链表来作为约瑟夫环的存储结构
三主要算法流程描述
1主要流程图
2具体程序段及其说明
#include
#include
typedef struct node{
int number;
int key;
struct node* next;
}listnode, * circularlist;//定义了结点类型listnode和指针类型circularlist
int main(){
int amount,t,code,m,k;// amount表示总人数,code表示相应的学生密码circularlist w=(listnode*)malloc(sizeof(listnode));
w->next=w;//循环链表仅一个元素时依然满足
listnode *v;
printf("请输入总人数:");
scanf("%d",&amount);
v=w;
for(k=1;k<=amount;k++){
printf("请输入第%d 学生的密码: ",k);
scanf("%d",&code);
w->key=code;
w->number=k;
if(k!=amount){
w->next=(listnode*)malloc(sizeof(listnode));
w=w->next;
}
w->next=v;
}//循环结束后自动生成链表头
printf(“约瑟夫环已建成,可以开始!\n”);
printf("请输入初值: ");
scanf("%d",&m);
if(m<=0){
printf("输入错误,请重新输入\n");
return(1);
}
m=m-1;//使w提前停下
printf("出列顺序是:");
//用w为起始点
do{
t=0;//加入m减1后为零的情况
while(t!=m){
w=w->next;
t++;
}
v=w->next;
w->next=v->next;
printf(" %d",v->number);
m=v->key;
m=m-1;
free(v);//释放v的存储空间
}while(w->next!=w);
printf(" %d\n",w->number);
free(w); //释放w的存储空间
getchar();
getchar();
return(0);
}
四使用说明
1进入C工作环境:如Turbo C2.0, Turbo C++ 3.0,Microsoft visual C++ 6.0(本次课程设计使用环境)
2输入自己所编好的程序,通过键盘或软键盘。
3.检查一遍已输入的程序是否有错(包括输入时打错的和编程中的错误),如发现有错,及时更正。
4进行编译和连接。如果在编译和连接过程中发现错误,屏幕上会显示“报错信息”,根据
提示找到出错的位置和原因,加以改正。再进行编译,直至顺利通过编译和链接为止。
5.运行程序并分析运行结果是否合理和正确。在运行时要注意当输入不同值时所得到的结果是否正确。此时应运行几次,分别检查在不同情况下程序是否正确。
6输出程序清单和结果。
数据测试
n=7,即amount=7, 初始报数限值m=20, 7 个人的密码依次是
3,1,7,2,4,7,4
可的输出序列是6 7 4 1 5 3 2
界面如下
(五)调试分析说明
测试过程中开始由于有个地方的分号没打上,出现了错误提示,然后找到症结所在。