设有编号为1,2,……,n的n(n>0)个人围成一个圈,每个人持有一个密码m,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,求n个人出圈的次序。由于约瑟夫环带有典型的循环特性,考虑用循环单链表存储,请用循环单链表实现约瑟夫环问题。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node* pnext;
}Node;
Node *link_create(int n)
{
Node *p,*q,*head;
int i;
p=(Node *)malloc(sizeof(Node));
head=p;
p->data=1;
for(i=2;i<=n;i++)
{
q=(Node *)malloc(sizeof(Node));
q->data=i;
p->pnext=q;
p=q;
}
p->pnext=head;
return head;
}
void link_process(Node *head,int m)
{
int i;
Node *p=head,*tmp1 = NULL;
while(p->data!=1)
p=p->pnext;
while(p->pnext != p)
{
for(i=0;i<m;i++)
{
tmp1=p;
p=p->pnext;
}
printf("%d ",p->data);
tmp1->pnext=p->pnext;
free(p);
}
}
int main(int argc, const char * argv[]){
Node *head=link_create(5);
link_process(head, 3);
system("pause");
return 0;
}