编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码,(正整数,可以自由输入),开始入选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他的顺时针方向上的下一个人开始从1报数,如此下去,直到所有人出列为止。
具体代码如下:
#include <iostream>
using namespace std;
typedef struct CListNode
{
int value;
CListNode *next;
}CListNode, *CListLink;
void Show_(CListLink *lt)
{
if (*lt == NULL)
{
return;
}
CListNode *p = *lt;
while (p->next != *lt)
{
cout << p->value << "-->";
p = p->next;
}
cout << p->value << "-->" << "Node" << endl;
}
CListNode *Create_N(int n)
{
//无头结点的循环链表
CListNode *p = NULL, *head;
head = (CListNode*)malloc(sizeof(CListNode));
p = head; //指向当前结点
int i = 1;
srand(time_t(0));
CListNode *s = NULL;
if (0 != n)
{
while (i <= n)
{
s = (CListNode*)malloc(sizeof(CListNode));
s->value = rand()%10 + 1;
p->next = s;
p = s;
i++;
}
s->next = head->next;
}
free(head);
return s->next;//第一个节点
}
void ChuLie(int n)
{
CListNode *temp;
CListNode *p = Create_N(n);
CListNode *q = NULL;
Show_(&p);
int m = p->value;
m %= n;
while (p != p->next)
{
if (m <= 1)
{
cout << q->next->value << "-->";
temp = q->next;
q->next = temp->next;
p = temp->next;
q = p;
}
else
{
for (int i = 1; i < m - 1; ++i)
{
p = p->next;
}
cout << p->next->value << "-->";
temp = p->next; //删除的元素
p->next = temp->next;
q = p;
p = p->next;
}
m = temp->value;
m %= n;
free(temp); //删除
}
cout << p->value << endl;
}
int main()
{
int n;
cin >> n;
ChuLie(n);
return 0;
}
在对m进行比较值进行分类比较,针对m==0||m==1是一种处理方法,其余是一种处理方法。
显示输出如下: