<span style="font-size:18px;">//用循环列表模拟约瑟夫问题
/* 解决问题的步骤:
(1)建立一个具有N个链节点、无头节点的循环链表
(2)确定第一个报数人的位置
(3)不段的从链表中删除链节点,直到链表为空
*/
#include<iostream>
using namespace std;
typedef int elemtype;
typedef struct Node
{
elemtype data;
struct Node *next;
}Node;
//创建有n个结点的循环链表
Node *CreatList(int n)
{
Node*head=(Node*)malloc(sizeof(Node));
Node*p,*s;
p=head;
int i=1;
for(;i<=n;i++)
{
s=(Node*)malloc(sizeof(Node));
s->data=i;
p->next=s;
p=s;
cout<<s->data<<" ";
}
s->next=p->next;
free(head);
return s->next;
}
int main()
{
int n=41;
int k=1;//从第n个人开始
int m=3;//数m出列
Node *q=CreatList(n);
Node*temp;
// Node*p=list;
while(q!=q->next)
{
for(int i=1;i<m-2;i++)
{
q=q->next;
}
temp=q->next;
cout<<temp->data<<" ";
q->next=temp->next;
free(temp);
}
cout<<q->data<<endl;
return 0;
}</span>