
题目
解决代码及点评
/* 功能: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)拷贝代码与运行
程序运行结果