一共有N个人,围成一圈,从一开始报数,数到M的人出局,然后重新开始报数。算出出局的人的顺序;如果最后只能剩下一个人,请问是几号?
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 9 //游戏参与人数
#define M 3 //死亡数字
//声明链表节点
typedef struct node {
int data;
struct node *next;
}linklist;
//创建循环链表
linklist* create_loop(linklist* phead, int a)
{
linklist* tmp = malloc(sizeof(linklist));
tmp->data = a;
tmp->next = NULL;
linklist* find = phead;
if(phead == NULL){
tmp->next = tmp;
return tmp;
} else {
while(find->next != phead)
find = find->next;
find->next = tmp;
tmp->next = phead;
}
}
//显示人的编号
void show(linklist* phead)
{
linklist* tmp = phead;
do{
printf("%d\t", phead->data);
phead = phead->next;
} while(phead != tmp);
printf("\n");
}
int main()
{
printf("共有%d个人\n",N);
printf("死亡数字为:%d\n",M);
int i = 0;
linklist* head = NULL;
head = create_loop(head, 1);
for(i=2;i<N+1;i++)
create_loop(head, i);
printf("每个人编号为:\t");
show(head);
linklist *p, *s, *q;
p = head;
int total = N;
q = head;
printf("依次出去的为:\t");
while (total != 1) {
/* 报数过程,p指向要删除的节点 */
for (i = 1; i < M; i++)
p = p->next;
printf("%d\t",p->data);
/* q 指向 p 节点的前驱 */
while (q->next != p)
q = q->next;
/* 删除 p 节点 */
q->next = p->next;
/* 保存被删除节点指针 */
s = p;
/* p 指向被删除节点的后继 */
p = p->next;
/* 释放被删除的节点 */
free(s);
/* 节点个数减一 */
total--;
}
printf("\n");
/* 打印最后剩下的节点序号 */
printf("最后一个为: %d\n", p->data);
free(p);
return 0;
}
结果: