算法——约瑟夫环问题

 //问题描述:编号是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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值