问题描述:
有 n 个人围成一个圈,从第 k 个人开始从 1 开始一个人一个人的报数,数到第 m 个人,让他出列;然后从出列的下一个人重新开始报数,数到第 m 个人,再让他出列,……,如此反复直到圆圈中只剩一个人为止,请模拟这一工作过程。即已知:人数 n,初始编号 k,出列值 m,而且每次的 m 值都不一样;输出整个过程中,出列编号的序列 L,以及最后留下的元素位置。建立一个无头结点的单向循环链表,定义指针pPer指向第一个结点,指针pFront指向出列的前一个结点,这是为了在出列的结点被删除(delete)后,能够将前后两个结点连接起来。
/**************************************
Exp_1:Josephus Problem
Author:Shawn__L
Date:2018.5.20
**************************************/
#include "stdafx.h"
#include<iostream>
using namespace std;
int m,n;
typedef struct Person
{
int k; //编号
int m; //密码
Person *next;
}Person;
Person * pPer = NULL; //pPer指向第一个结点,此链表没有头节点
Person * pFront = NULL; //pFront指向出列的前一个结点
void init() //初始化函数
{
Person *temp;
Person *p;
cout << "请输入人数:";
cin >> n;
cout