约瑟夫环问题,循环链表建立

/*已知n个人(以编号1,2,3,。。。n分别表示)
围坐在一张圆桌周围。从编号为K的人开始报数,
数到m的那个人出列;他的下一个人又从k开始报数,
数到m的那个人出列;依次规律重复下去,
直到圆桌周围的人全部出列。*/
//约瑟夫环问题,循环链表
#include<iostream>
#include<cstring>
#include<cstdio>
using  namespace std;
typedef struct lnode
{
    int data;
    struct lnode *next;
}node;
node *link_create(int n)//创建n个节点的循环链表 
{
    node *p,*q,*head;
    int i;
    p=new node;
    head=p;
    p->data=1;
    for(i=2;i<=n;i++)
    {
        q=new node;
        q->data=i;
        p->next=q;
        p=q;
    }
    p->next=head;//最后一个节点指向头部,形成循环链表
    return head;
}
void josephus(node *head,int k,int m)
{
   node *p=head,*tmp1;
   int i;
   while(p->data!=k)
       p=p->next;
    while(p->next!=p)
     {
        for(i=0;i<m;i++)
        {
            tmp1=p;
            p=p->next;
        }
        printf("%d",p->data);
        tmp1->next=p->next;
        delete p;
        p=tmp1->next;
      }
      printf("%d ",p->data);

}
int main()
{
    node *head=link_create(5);
    josephus(head,3,1);
    return 0;

}
原文地址:https://www.cnblogs.com/cancangood/p/4905463.html