我们构造一个循环链表来表示排成圆圈的人.每人的链接指向圆圈内在他左边的人.整数i表示圆圈内的第i个人.在为1号构造一个节点的循环链表之后,再把2~N号插入到1号节点之后,得到一个1~N的环,并使x指向N.然后从1号开始,跳过M-1个节点把第M-1个节点的链接指向M+1号节点继续这个过程,直到剩下一个节点为止.
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <malloc.h>
using namespace std;
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct node* link;
struct node{
int item;
link next;
};
int main(int argc, char *argv[])
{
///输入人数n,和数字m
int i, n, m;
scanf("%d %d", &n, &m);
///定义一个头指针h和一个指针p
link h, p;
///将头节点h赋值
h = (link)malloc(sizeof(struct node));
p = h;
h->item = 1;
h->next = h;
///将2~n添加进链表
for(i = 2; i <= n; i++)
{
p->next = (link)malloc(sizeof(struct node));
p = p->next;
p->item = i;
p->next = h;
}
///while循环结束条件p->next!=p
while(p->next != p)
{
///定义一个cnt
int cnt = 1;
///循环m-1次,删除第m个节点
while(cnt < m)
{
cnt++;
p = p->next;
}
///找到第m个节点,删除
link q = p->next;
p->next = q->next;
///释放节点q
free(q);
}
///链表中只剩一个元素,将该元素输出
printf("%d\n", p->item);
return 0;
}