实验一
约瑟夫问题
实验学时:
3
学时
实验类型:设计
实验要求:必修
一、实验目的
熟练掌握线性链表的基础知识;
能够使用
C++
或其他程序设计语言编程实现线性链表;
能够使用线性链表构造正确而且时间复杂度低的算法解决实际问题;
锻炼程序设计能力。
二、实验内容
M
个教徒和
N
个非教徒在深海上遇险,必须将
N
个人投入海中,其余
的人才能幸免于难,于是想了一个办法:所有人围成一圆圈,从第一个人
开始依次报数,每数到第
K
个人就将他扔入大海,如此循环进行直到仅余
M
个人为止。设计一个算法,找出这样一个排序:使每次被扔进大海的都
是非教徒。并用程序设计语言实现。
三、实验原理、方法和手段
使用循环单链表,
将每个人作为一个结点,
每个结点的指针域指向下一个人,
采用循环链表的遍历对每隔
N-1
个结点的结点进行标记,
直至标记出
N
个结点为
止。该实验亦可用顺序表实现。
四、实验组织运行要求
本实验采用集中授课形式,每个同学独立完成上述实验要求。
五、实验条件
每人一台计算机独立完成实验,有如下条件:
(
1
)硬件:联想高性能
PC
机;
(
2
)软件:
VC++ 6.0
、
VC++.Net
。
六、实验步骤
(
1
)编写循环链表构造函数
Node
*Create(
)
,使链表中每个结点的数据域值为
0
,并让最后一个结点的指针域指向第一个结点;
(
2
)编写约瑟夫问题函数
Node *Move(Node *H,
int
n);
void
Insert(Node *H,
int
pos,
int
data);
(
5
)主函数中调用
Create
,
Move
和
Insert
,采用具体数据计算,输出结果。
七、实验程序
// stdafx.h :
标准系统包含文件的包含文件,
//
或是经常使用但不常更改的
//
特定于项目的包含文件
//
#pragma
once
#include
"targetver.h"
#include
#include
#include
using
namespace
std;