数据结构约瑟夫环问题的课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

界面如下

(五)调试分析说明

测试过程中开始由于有个地方的分号没打上,出现了错误提示,然后找到症结所在。

相关文档
最新文档