/*
1...n的n个人围坐一圈,约定序号为k的人从1开始计数,数到m的那个人出列,他的下一个又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列
*/
循环单链表实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node;
void printlist(node *head)
{
node *p=NULL;
node *q=NULL;
if(NULL==head)
{
printf("list null\n");
return;
}
q=p=head;
while(p->next!=q)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d ",p->data);
printf("\n");
}
void josephu(node *head)
{
int k=0;
printf("请输入从第几个开始计数:\n");
scanf("%d",&k);
int m=0;
printf("请输入数到几退出:\n");
scanf("%d",&m);
int i=0;
node *p=NULL;
node *q=NULL;
//node *r=NULL;
//r=p=head;
p=head;
printf("head:%d\n",head->data);
for(i=1;i<k;i++)
{
p=p->next;
}
printf("head+k:%d\n",p->data);
while(p->next!=p)
{
for(i=1;i<m;i++)
{
q=p;
p=p->next;
}
printf("出队列的人是%d ",p->data);
q->next=p->next;
free(p);
p=q->next;
}
printf("最后出队列的是:%d ",p->data);
printf("\n");
}
int main()
{
node *head=NULL;
node *p=NULL;
node *s=NULL;
int n=0;
printf("请输入链表的个数:\n");
scanf("%d",&n);
int i=0;
for(i=0;i<n;i++)
{
s=(node *)malloc(sizeof(node));
s->data=i;
s->next=NULL;
if(i==0)
{
p=s;
}
s->next=head;
head=s;
}
p->next=head;
printlist(head);
josephu(head);
return 0;
}
循环数组实现:
#include <stdio.h>
int main()
{
int nNum1=0;
int nNum2=0;
int n=0;
printf("请输入人的个数n:\n");
scanf("%d",&n);
int a[n];
printf("请输入从第几个开始计数:\n");
int k=0;
scanf("%d",&nNum1);
k=nNum1-1;
printf("请输入数到几的人出列:\n");
int m=0;
scanf("%d",&nNum2);
m=nNum2;
int i=0;
for(i=0;i<n;i++)
{
a[i]=1;
}
int count=0;
int j=0;
printf("%d %d %d\n",n,k,m);
for(i=0;i<n;i++)
{
for(j=k;1;j++)
{
j=j%n;
if(a[j]==1)
{
count++;
if(count==m)
{
a[j]=0;
break;
}
}
}
printf("出列的人是:%d\n",j);
k=j+1;
for(j=k;;j++)
{
if(a[j]==1)
{
k=j;
break;
}
}
count=0;
}
return 0;
}