已知N个人(以编号1,2,3,4,…,N分别表示)围坐在一张圆桌周围。从编号为K的人开始报数,数到M的那个人出列,他的下一个人又从K开始报数,数到M的那个人又出列,依此规律重复下去,直到圆桌周围的人全部出列,试用C++编程实现。
分析问题是一个约瑟夫环的问题,使用循环链表。
//创建循环链表
typedef struct LNode{
int data;
struct LNode *link;}LNode,*LinkList;
void yuesefu(int n,int k,int m)
{
LinkList p,list,curr;
p=(LinkList)malloc(sizeof(LNode));
p->data=0;
p->link=p;
curr=p;
for(int i=1;i<n;i++)
{
LinkList t;
t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;
curr->link=t;//循环链表
curr=t;
}
//算法
while(k--)list=p,p=p->link;
while(n--)
{
for(int s=m-1;s--;list=p,p=p->link);
list->link=p->link;
cout<<p->data<<"->";
free(p);
p=list->link;
}