使用循环链表实现约瑟夫环
2015-10-04 17:54
295 查看
约瑟夫算法:n个人围成一圈,每个人都有一个互不相同的密码,该密码是一个整数值,选择一个作为起点,然后顺时针从1到k(k为起点人手中的密码值)数数。数到K的人退出圈子,然后从下一个开始继续从1到j(刚退出圈子的人的密码)数数,数到j的人退出圈子。重复上面的过程,直到剩下最后一个人。
#include "stdio.h" #define N 9 #define OVERFLOW 0 #define OK 1 typedef struct LNode{ int keyword; struct LNode *next; }LNode,*LinkList; int KeyW ={4,7,5,9,3,2,6,1,8}; void Joseph(LinkList p,int m, int x); int main() { int i,m; LinkList Lhead,p,q; Lhead=(LinkList)malloc(sizeof(LNode)); if(!Lhead) return OVERFLOW; Lhead->keyword=KeyW[0]; Lhead->next=NULL; p=Lhead; for(i=1;i<9;i++){ if(!(q=(LinkList)malloc(sizeof(LNode))))return OVERFLOW; q->keyword=KeyW[i]; p->next=q; p=q; } p->next=Lhead; printf("Please input the first record m: \n"); scanf("%d",&m); printf("The output alignment is:\n"); Joseph(p,m,N); getch(); return OK; } void Joseph(LinkList p,int m,int x){ LinkList q; int i; if(x==0)return; q=p; m%=x; if(m==0)m=x; for(i=1;i<=m;i++){ p=q; q=p->next; } p->next=q->next; i=q->keyword; printf("%d ",q->keyword); free(q); Joseph(p,i,x-1); }
相关文章推荐