约瑟夫环加强版--For初学者

经典的约瑟夫问题,click here,本文是加强版的,问题是这样的,n个人围成一圈,每一个人手里拿着一个纸条,每一个纸条上面写着一个数字(我们假设在1~100之间),首先,给出一个数,从第k个人开始报数,淘汰一个人,淘汰的人打开手里的纸条,从他下一个开始报数,直到报数到纸条上的数,依次进行直到剩余一人。
本文的代码注释不多,如果有看不太懂的读者,那么点击这里
本人能力有限,难免有bug,编译环境为Code::Blocks,如有疑问,请留言。
代码如下:

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>

typedef int ElemType;

typedef struct node
{
    ElemType data;
    ElemType nextdata;//记录淘汰人手里的号码
    struct node *next;
}LNode;

void Josephus(ElemType n,ElemType m,ElemType k)
{

    srand(time( NULL ));
    LNode *q,*p;
    ElemType i,elem;
    p=(LNode *)malloc(sizeof(LNode));
    q=p;

    for(i=1;i<n;i++)
    {
        q->data=k;
        q->nextdata=1 + (rand()%100);//随机生成1~100的数字
        printf("第%d个人,手里的号码:",k);
        printf("%d\n",q->nextdata);
        k=k%n+1;
        q->next=(LNode *)malloc(sizeof(LNode));
        q=q->next;
    }
    q->data=k;
    q->nextdata=1 + (rand()%100);
        printf("第%d个人,手里的号码:",k);
        printf("%d\n",q->nextdata);
    q->next=p;
    printf("依次淘汰的人\n");
    elem=m;//最开始淘汰的人是给定的数
    while(p->next!=p)
    {
        for(i=1;i<elem;i++)
        {

            q=p;
            p=p->next;
        }
        q->next=p->next;
        printf("%4d",p->data);
        elem=p->nextdata;//淘汰一个人,把他手里的号码记录下来
        free(p);
        p=q->next;
    }
    printf("\n剩的最后一人\n");
    printf("%4d",p->data);
}
ElemType main()
{
    ElemType n,k,m;
    printf("输入人数n,开始的报数m,开始的人k\n");
    scanf("%d%d%d",&n,&m,&k);
    Josephus(n,m,k);
    return 0;
}

我把每个人手里的数字用随机数生成。
运行结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/a_52hz/article/details/82925839