用循环链表实现的,思路很简单,只是要注意指针的修改,编程基础差的容易出错。
/*约瑟夫环 - 循环链表实现
Author : Milo.Wang
Date : 2012/9/15
*/
#include <iostream>
using namespace std;
typedef struct Node{
int num;
struct Node *next;
} Node, *NodePtr;
void JosephusRing(int n, int k, int m)
{
NodePtr L = NULL, p, s;
int i;
for(i = 0; i < n; ++i){
if(!L){
L = p = (NodePtr)malloc(sizeof(Node));
p->next = p;
}
else
{
NodePtr q = (NodePtr)malloc(sizeof(Node));
q->next = p->next;
p->next = q;
p = q;
}
if(i+1 == k)
s = p;
p->num = i+1;
}
while(1){
int i;
for(i = 0; i < m-2; ++i){
s = s->next;
}
printf("%d\n",s->next->num);
p = s->next;
s->next = p->next;
free(p);
if(p == s)
{
break;
}
s = s->next;
}
}
int main(int argc, char *argv[])
{
JosephusRing(10,1,5);
return 0;
}