约瑟夫环

来源:互联网 发布:任玩堂 知乎 编辑:程序博客网 时间:2024/06/05 00:37
#include<cstdio>#include<cstdlib>//#include<bits/stdc++.h>using namespace std;typedef struct Lnode{    int id;    int code;    struct Lnode *next;}Lnode,*Linklist;Linklist Createlist(int n)//创建链表 {     Lnode *head=NULL,*tail=NULL;    for(int i=1;i<=n;i++)    {          //Lnode *p=(Lnode *)malloc(sizeof(struct Lnode));          Linklist p=(Linklist)malloc(sizeof(Linklist));          p->id=i;          printf("输入第%d个人的密码:",i);          scanf("%d",&p->code);          if(tail)               tail->next=p;          else               head=p;          tail=p;    }    if(tail)//成环          tail->next=head;    return tail;}void print(Linklist tail)//输出 {    Linklist head=tail;    Linklist p=tail->next;    printf("每个人的初始序号和初始密码:\n");     while(p!=head)//head标志起点     {          printf("(%d %d) ",p->id,p->code);          p=p->next;    }    printf("(%d %d)",p->id,p->code);}Linklist play(Linklist& tail,int n,int m)//进行游戏 {    Linklist pre,p;    pre=tail;    printf("出列顺序为:");    while(n>1)    {         p=pre->next;         m==m%n?m%n:n;//=         for(int i=1;i<=m-1;i++)         {               pre=p;               p=p->next;         }         printf("%d ",p->id);         //p=p->next         pre->next=p->next;         m=p->code;         n--;    }    printf("%d\n\n",pre->id);//pre始终指向为待出列人前驱 }int main(){    int n,m;    printf("输入总人数和初始密码:");     while(scanf("%d",&n),n)    {         scanf("%d",&m);        printf("*人数为0则游戏结束*\n");        Linklist tail=Createlist(n);        if(tail)        {            print(tail);            play(tail,n,m);        }        printf("输入总人数和初始密码:");    }    return 0; } 
0 0