P1996 约瑟夫问题

#include<bits/stdc++.h>
using namespace std;
/*
n 个人围成一圈,从第一个人开始报数,数到m 的人出列,再由下一个人重新从1 开始报数,
数到m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号
*/
struct node//定义链表节点
{
    int data;//节点的值
    node* next;//单向链表,只有一个next指针
};
int main()
{
    int n,m;
    scanf_s("&d %d", &n, &m);
    node* head, * p, * now, * prev;//定义变量,头指针,尾指针,
    head = new node;//给头指针申请一块新的空间
    head->data = 1;
    head->next = NULL;//初始化常规操作,分配一个节点,数据置为1
    now = head;//这个now这个指针就是用来告诉你,现在储存到哪一个指针了,默认先指向头
    for (int i = 2; i <=n ; i++)
    {
        p = new node;//p是新的节点
        p->data = i;
        p->next = NULL;
        now->next = p;//上面刚刚申请的节点连在前面的后面
        now = p;//既然连上了,那么就将尾指针移动到下一个
    }
    now->next = head;//初始完所有的链表,最后就把头跟尾部连接起来
    //上面就是建立链表的基本操作
    cout << "*************************************************" << endl;
    now = head;
    prev = head;//从第一个开始数数
    while ((n--)>1)//当出圈到1的时候就不在执行这个循环
    {
        for (int i = 1; i < m; i++)//从第一个开始数,数到m就不能在继续数了,m那个人要出圈
        {
            prev = now;//纪录上一个数数人的位置
            now = now->next;//移到当前数数的人
        }
        printf(" %d ", now->data);//输出第m个节点,带空格
        prev->next = now->next;//这个时候就发挥了之前那个prev=now的作用了,就是为了跳过已经出圈的人
        delete now;//释放节点,出圈就释放,申请了内存就得释放
        now = prev->next;//从出圈那个人的后面又开始数数,新的一轮开始
    }
    printf(" %d", now->data);//打印最后一个节点
    delete now;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值