约瑟夫循环链表

来源:互联网 发布:贾敏 知乎 编辑:程序博客网 时间:2024/05/21 10:26
//// 约瑟夫循环链表

#include<iostream>
using namespace std;


struct Node
{
int data;
Node *link;
};


void josephus(int n,int k,int m)//n个人,第k个开始计数,计到m就出列
{
Node *list;//把它设为头结点
list=(Node*)malloc(sizeof(Node));
list->data=1;
Node *p,*s;
p=(Node*)malloc(sizeof(Node));
p->data=2;
list->link=p;
for(int i=3;i<=n;i++)//要保证最后一个的link指向头结点
{
s=(Node*)malloc(sizeof(Node));
s->data=i;
p->link=s;
p=s;
}
p->link=list;//最后一个指针指向了头指针


//这是检测代码
//p=list;
//while(p!=NULL)
//{
// cout<<p->data<<"  ";
// p=p->link;
//}


p=list;
for(int i=1;i<k;i++)
p=p->link;//第k个人

while(n--)
{
for(int i=m;i>0;i--,s=p,p=p->link )
;//空循环
cout<<p->data<<endl;
s->link=p->link;
free(p);
p=s->link;//防止垂悬指针
}
}




int main(void)
{
josephus(13,4,1);
return 0;
}
0 0