#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;
}
P1996 约瑟夫问题
最新推荐文章于 2024-08-20 23:02:50 发布