网上说法很多。。这里简单描述一下。
一群人围成一个圈,每个人都有自己的密钥。。出列后用其密钥做下一个循环出队数。
源代码
#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
原文地址:http://blog.csdn.net/u011185633/article/details/44876901