
题目
解决代码及点评
/*
功能:13个人围成一圈,从第一个人开始顺序报号1、2、3。 凡报到“3”者退出圈子。找出最后留在圈子里的人原来的序号。
*/
#include<stdio.h>
#include<stdlib.h>
#define N 13 //共13个人
struct people //创建双向链表
{
int ID; //人物序号
struct people *pNext; //下个元素的地址
};
typedef struct people PEO;
void init(PEO *a,int n); //输入每个人的信息
void main()
{
PEO a[N];
init(a, N); //对人物信息进行初始化
int total = N; //剩余人数,初始化为N
int num = 1; //报数器
PEO *p = &a[0];
for (PEO *pPrior=&a[N-1];total!=1; p=p->pNext) //pPrior指向当前结点的前一个结点
{
if (num != 3){
num++;
pPrior = pPrior->pNext; //前结点向后移一个单位
continue;
}
else
{
pPrior->pNext = p->pNext; //删除当前结点
num = 1;
total--; //生剩余人数--,当人数剩余为1时循环结束
}
num++;
}
printf("%d",p->ID);
system("pause");
}
void init(PEO a[], int n)
{
for (int i = 0; i < n; i++)
{
a[i].ID = i + 1; //每个人的编好
if (i != n - 1)
{
a[i].pNext = &a[i + 1]; //将下一个的地址赋给pNext
}
else
{
a[i].pNext = &a[0]; //将序号为1的地址赋给最后一个元素的pNext
}
}
}
代码编译以及运行
由于资源上传太多,资源频道经常被锁定无法上传资源,同学们可以打开VS2013自己创建工程,步骤如下:
1)新建工程
2)选择工程
3)创建完工程如下图:
4)增加文件,右键点击项目
5)在弹出菜单里做以下选择
6)添加文件
7)拷贝代码与运行
程序运行结果