约瑟夫环算法(循环链表解决)

 

问题:约瑟夫环
 有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始,
 如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。

#include <stdio.h> struct node { int v; struct node *next; }*p,*head,h; //head是头指针,h是头结点 main() { int n,m; int i; puts("请输入人数n和报数上限m :"); scanf("%d%d",&n,&m); h.next=NULL; //头结点的next为空 head=&h; //头指针指向头结点 p=head; //p也指向头结点 /**//*下面的循环用来建立循环链表*/ for(i=1;i<=n;i++) { p->next=(struct node*)malloc(sizeof(struct node)); p=p->next; p->v=i; if(i!=n) { p->next=NULL; } else { p->next=head->next; } } p=head; p=p->next; //p指向第一个结点 m%=n;//当m>n时有用 while(p!=p->next) { for(i=1;i<=m-2;i++) { p=p->next; } printf("%d ",p->next->v); p->next=p->next->next; p=p->next; } printf("%d",p->v); }

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/koudaidai/article/details/7358206
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞