[问题描述]
已知n个人(以编号1,2,3,..., n分别表示)围坐在一张圆桌周围从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依次规律重复下去,知道圆桌只剩下一个人,求这个人编号。
[基本思想]
- 创建循环链表,赋初始值
- 外循环次数为n,循环内部每次找定一个值不为0的元素,连续访问m次,当访问到第m个元素时,如果当前值不为0,输出。
- 继续访问,直至全部输出
[代码]
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
void createList(LNode *L, int n)
{
int i;
LNode *p = L;
for(i = 0;i < n;i++)
{
LNode *q = (LNode*)malloc(sizeof(LNode));
q->data = i + 1;
q->next = p->next;
p->next = q;
p = q;
}
p->next = L;
}
int main()
{
int n, s, m;
int i, j=0;
printf("输入参与信息(参与人数,第n个人开始,出列数): ");
scanf("%d,%d,%d", &n, &s, &m);
LNode *L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
createList(L, n);
LNode *p=L->next;
for(i = 1;i < s;i++)
p = p->next;
printf("\n输出次序为: \n");
for(i = 0;i < n;i++)
{
j = 1;
while(j < m)
{
while(p->data == 0)
{
p = p->next;
if(p == L)
p = p->next;
}
p = p->next;
j++;
}
while(p->data == 0)
{
p = p->next;
if(p == L)
p = p->next;
}
printf("%d ", p->data);
p->data = 0;
}
return 0;
}