网上说法很多。。这里简单描述一下。
一羣人围成一个圈,每个人都有自己的密钥。。出列后用其密钥做下一个循环出队数。
源代码
#include<stdio.h>
#include<stdlib.h>
typedef struct _node{
int ord;//order
int key;//key
struct _node* next;
}Node,*pNode;
pNode Create(){
int k,o=1;
pNode head,cur,h;
if(scanf("%d",&k),k){
head=h=cur=(pNode)malloc(sizeof(Node));
h->ord=o++;
h->key=k;
h->next=NULL;
}else{
return NULL;
}
while(scanf("%d",&k),k){
cur=(pNode)malloc(sizeof(Node));
cur->ord=o++;
cur->key=k;
cur->next=NULL;
h->next=cur;
h=cur;
}
h->next=head;
return head;
}
void joh(pNode head,int start,int m){
pNode h=head,tem;
int count=1;
while(h->next->ord!=start){
h=h->next;
}
while(h->next){
while(count<m){
h=h->next;
++count;
}
if(count==m){
m=h->next->key;
printf("ord=%d,key=%d\n",h->next->ord,h->next->key); //供测试用
tem=h->next;
h->next=h->next->next;
free(tem);
count=1;
}
if(h==h->next){
printf("ord=%d,key=%d\n",h->next->ord,h->next->key);
free(h);
break;
}
}
}
void show(pNode head){
pNode h=head;
while(h){
printf("ord=%d,key=%d\n",h->ord,h->key);
h=h->next;
if(h==head){
break;
}
}
}
int main(){
pNode head=Create();
show(head);
printf("\n\n");
joh(head,3,3);
return 0;
}
测试数据
ord=1,key=2
ord=2,key=3
ord=3,key=4
ord=4,key=2
ord=5,key=5
ord=6,key=3
ord=7,key=2
ord=8,key=4
ord=9,key=3
ord=10,key=4
ord=11,key=2
ord=12,key=3
ord=13,key=2
ord=5,key=5
ord=10,key=4
ord=1,key=2
ord=3,key=4
ord=8,key=4
ord=13,key=2
ord=4,key=2
ord=7,key=2
ord=11,key=2
ord=2,key=3
ord=12,key=3
ord=6,key=3
ord=9,key=3