📄 yuesefu.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
//结点
typedef struct NODE
{
int num; //每个元素各自的号码,或者头结点用作记录剩余的人数
NODE *next; //下一个元素
}NODE;
//建立循环链表
NODE *Create(int n)
{
NODE *Node; //头结点
NODE *node,*p; //元素结点及临时变量
int i; //计数器
Node=(NODE *)malloc(sizeof(NODE));
Node->num=n; //初始化人数为总人数
Node->next=NULL;
p=Node;
for(i=1;i<=n;i++)
{
node=(NODE *)malloc(sizeof(NODE));
node->num=i; //编号
node->next=p->next; //尾插法
p->next=node;
p=p->next;
}
p->next=Node->next; //将最后一个元素指向第一个元素
return Node;
}
//删除结点
NODE *Die(NODE *Node,int k)
{
NODE *p,*q; //临时指针
int m=Node->num/2; //生还者的人数
int i=0; //计数器
p=q=Node;
for(;Node->num>m;)
{
p=p->next;
i++;
while(i<k)
{
p=p->next;
q=q->next; //q始终在p之前一个位置
i++;
}
printf("%d ",p->num); //输出要删除的结点
if(Node->next==p) //若删除的结点是头结点所连的结点,则需改动头结点的指针
Node->next=p->next;
q->next=p->next; //删除结点
free(p); //释放结点
p=q;
Node->num--; //生还者的人数减一
i=0; //计数器清空
}
return Node;
}
//遍历循环链表
void Print(NODE *Node)
{
int i; //计数器
NODE *p; //临时指针
p=Node->next;
for(i=0;i<Node->num;i++,p=p->next)
printf("%d ",p->num);
}
void main()
{
int n; //存放总人数,并且做游戏中的计数器
int k; //报数上限
char choice='Y';
NODE *Node; //头结点
printf("\n*************** 约瑟夫生死游戏 ***************\n\n");
while(choice=='Y'||choice=='y')
{
printf("请输入参加游戏的人数:\n");
scanf("%d",&n);
printf("\n请输入报数上限:\n");
scanf("%d",&k);
Node=Create(n);
printf("\n将面临死亡的游戏者的编号为:\n");
Node=Die(Node,k);
printf("\n\n生还者的编号为:\n");
Print(Node);
printf("\n\n*************** 本轮游戏结束!***************\n\n");
printf("是否重新开始新的游戏?(Y or N)");
choice=getchar(); //忽略多余的回车
scanf("%c",&choice);
printf("\n\n");
}
printf("\n已经退出游戏!\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -