先看下定义:
有M个人围坐成一圈, 编号依次从1开始递增,现从编号为1的人开始报数,报到N的人出列,然后再从下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列。求出列次序。
不难看出,用循环链表可以比较容易的解决,代码如下。
#include<stdio.h>
#include<malloc.h>
typedef struct LinkList
{
int data;
struct LinkList *next;
}LinkList,*PLink;
PLink CreateL(int n)
{
PLink head = (PLink)malloc(sizeof(LinkList));
PLink q = head,p;
head->data = 1;
for(int i = 2;i <= n;i++)
{
PLink p = (PLink)malloc(sizeof(LinkList));
q->next = p;
p->data = i;
q = p;
}
q->next = head;
return head;
}
void ysfh(PLink head,int m,int n)
{
PLink q = NULL;
for(int i = 0;i < m;i++)//删m次就够了
{
for(int j = 0;j < n-2;j++)
{
head = head->next;
}
q = head->next;
head->next = q->next;
head = head->next;//每次让head指向下一次报数的起点
printf("%d ",q->data);
free(q);
}
}
int main()
{
int M,N;
scanf("%d %d",&M,&N);
PLink head = CreateL(M);
ysfh(head,M,N);
}
整体来说代码没难度,熟悉下链表的操作。。。。
结果如下图: