报数出圈

来源:互联网 发布:tensorflow gpu 编辑:程序博客网 时间:2024/06/06 00:45
/*设有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 和起始报数人序号kprintf("Please input n, m, k:\n");scanf("%d,%d,%d", &n, &m, &k);Josephus(n, m, k);printf("\n");return 0;}