约瑟夫环(已知N个人,围坐在一张圆桌周围)

已知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;
}

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/yizhiyanstart/article/details/37902063
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞