- #include <iostream>
- #include <typeinfo>
- #include <stdio.h>
- using namespace std;
- typedef struct LNode{
- int data;
- struct LNode* link;
- }LNode,*LinkList;
- void JOSEPHUS(int n,int k,int m){//n为总人数,k为第一个开始报数的人,m为出列者报的数
- LinkList p,r,List,cur;
- //创建一个长度为n的循环链表
- p=(LinkList)malloc(sizeof(LNode));
- p->data=0;
- p->link=p;
- cur=p;
- for (int i=1;i<n;i++)
- {
- LinkList t=(LinkList)malloc(sizeof(LNode));
- t->data=i;
- t->link=cur->link;
- cur->link=t;
- cur=t;
- }
- //找到第一个开始报数的人,用p来记录
- r=cur;
- while(k--)
- r=p,p=p->link;
- //从第k个开始每报到m则删除一个节点,直至全部出列
- while (n--)
- {
- for (int s=m-1;s--;r=p,p=p->link);
- r->link=p->link;
- printf("%d->",p->data);
- free(p);
- p=r->link;
- }
- }
- int main(){
- JOSEPHUS(13,4,2);
- return 0;
- }
使用循环单链表解决约瑟夫环问题
最新推荐文章于 2022-10-11 12:44:09 发布