数据结构练习:约瑟夫问题——循环链表的建立与使用

1.约瑟夫问题

描述:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入:输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。

输出:输出包含一行,即最后猴王的编号。

 

样例输入

12 4

样例输出

1

#include<stdio.h>
#include<stdlib.h>   //存放malloc,calloc,realloc,free函数
using namespace std;
typedef int ElemType;

typedef struct DNode   //结点类型
{
    int data;                    //数据域
    struct DNode *next; //指针域
}DNode;  //DNode为结构体类型的变量名。
int main()
{
    DNode *L,*r,*s,*p;
    int i,n,k;
    scanf("%d%d",&n,&k);
    L = (DNode *)malloc(sizeof(DNode));
    r = L;
    for(i = 1; i <= n; i++)    //尾插法建立链表,插入数据
    {
        s = (DNode *)malloc(sizeof(DNode));
        s->data = i;
        r->next = s;
        r = s;
    }
    p = L->next;
    s->next = p;   //连接首尾元素,使链表成环。
    free(L);     // 释放头结点
    while(p->next != p)
    {
        for(i = 1; i< k-1; i++)
        {
            p = p->next;
        }
        p->next = p->next->next;    //将第k只猴子淘汰
        p = p->next;
    }
    printf("%d\n",p->data);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值