/*设有n个人围成一圈并编号为1-n。
由编号为k的人进行1到m的报数,数到m的人出圈。
接着再从他的下一个人重新开始1到m的报数,直到所有人都出圈。
请输出出圈人的次序*/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char data; //data为节点的数据信息
struct node *next; //next为指向后继节点的指针
}LNode;
void Josephus(int n, int m, int k)
{
LNode *p, *q;
int i;
p = (LNode *)malloc(sizeof(LNode));
q = p;
for (i = 1; i < n; i++) //从编号k开始建立一个单链表
{
q->data = k;
k = k % n + 1;
q->next = (LNode *)malloc(sizeof(LNode));
q = q->next;
}
q->data = k;
q->next = p; //链接成循环单链表,此时p指向编号为k 的节点
while (p->next != p) //当循环单链表中的节点个数不为1时
{
for (i = 1; i < m; i++)
{
q = p;
p = p->next;
} //p 指向报数为m 的节点,q 指向报数为m-1 的节点
q->next = p->next; //删除报数为m 的节点
printf("%4d", p->data); //输出出圈人的编号
free(p); //释放被删节点的空间
p = q->next; //p 指向新的开始报数节点
}
printf("%4d", p->data); //输出最后出圈人的编号
}
int main()
{
int n, m, k;
//输入总人数n,报数个数m 和起始报数人序号k
printf("Please input n, m, k:\n");
scanf("%d,%d,%d", &n, &m, &k);
Josephus(n, m, k);
printf("\n");
return 0;
}
报数出圈
最新推荐文章于 2023-03-19 15:09:14 发布