#include <cstdlib>
#include <iostream>
#include <stdio.h>
#define ERROR 0
using namespace std;
typedef struct LNode
{
int data;
struct LNode *link;
}LNode,*LinkList;
void Josephus(int n,int k,int m)
{
//n 为总人数,k为第一个开始报数的人,m为出列者喊道的数字
// p 为当前节点,r为辅助节点 ,指向p的前驱,list为头节点
LinkList p,r,list,curr;
/*建立循环链表*/
p=(LinkList)malloc(sizeof(LNode));
p->data=0;
p->link=p;
curr=p;
for(int i=1;i<n;i++)
{
LinkList t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;
curr->link=t;
curr=t;
}
/*把当前指针移动到第一个报数的人*/
r=curr;
while(k--)
{ r=p;
p=p->link;
}
while(n--)
{
for(int s=m-1;s--;r=p,p=p->link);
r->link=p->link;
printf("%d->",p->data);
free(p);
p=r->link;
}
}
int main(int argc, char *argv[])
{
Josephus(13,4,1);
system("PAUSE");
return EXIT_SUCCESS;
}
循环链表实现约瑟夫环
最新推荐文章于 2024-01-12 15:19:14 发布