约瑟夫环问题

来源:互联网 发布:网络推广的收费标准 编辑:程序博客网 时间:2024/06/06 21:00
 //问题描述:编号是1,2,……,n(n>0)的n个人按照顺序时针方向围坐一圈,//每个人持有一个正整数密码。开始时任选一个正整数作为报数上限值m,//从某个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列//将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去//直到所有人全部出列为止。设计一个程序来求出出列顺序,并输出结果。#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct Node{    int num,cipher;//num编号,cipher密码    struct Node *next;}*LinkList;LinkList creat(int n);//创建链表void select(LinkList list,int m);int main(){    int n,m;    LinkList list;    printf("请输入人数:\n");    scanf("%d",&n);    printf("请输入初始报数的最大值:\n");    scanf("%d",&m);    list=creat(n);    select(list,m);    return 0;}LinkList creat(int n){    int k,idx=1;    LinkList list;    struct Node *r,*p;    p=(struct Node*)malloc(sizeof(struct Node));    if(p==NULL)    {        printf("系统溢出错误!\n");        exit(1);    }    list=p;    p->num=1;    printf("输入第%d个人的密码:\n",idx++);    scanf("%d",&p->cipher);    r=p;    p->next=p;    for(k=2;k<=n;k++)    {        p=(struct Node*)malloc(sizeof(struct Node));        p->num=k;        printf("输入第%d个人的密码:\n",idx++);        scanf("%d",&p->cipher);        r->next=p;        r=p;    }    p->next=list;    return (list);}void  select(LinkList list,int m){    struct Node *p;    while(1)    {        if(list->next==list)        {            printf("出列的序号为: %d,密码是:%d\n",list->num,list->cipher);            free(list);            return ;        }        while(--m>0)            list=list->next;        printf("出列的序号为:%d,密码是:%d\n",list->num,list->cipher);        m=list->cipher;        p=list->next;        list->next=p->next;        list->num=p->num;        list->cipher=p->cipher;        free(p);    }}


2 0
原创粉丝点击