几个孩子围成圈报数 当等于3的时候删除 链表实现 最终输出剩下孩子的编号

这个题目采用的2个指针,链表涉及到删除 通常都会用其中一个指针保存前面的地址 紧跟着

 1 //功能:13个人围成一圈,从第一个人开始顺序报号1、2、3。
 2 //凡报到“3”者退出圈子。找出最后留在圈子里的人原来的序号。
 3 
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 
 7 #define N 13                    //共13个人
 8 
 9 struct people                    //创建链表
10 {
11     int ID;                        //人物序号
12     struct people *pNext;        //下个元素的地址
13 };
14 
15 typedef struct people PE;
16 
17 void init(PE *a, int n);        //输入每个人的信息
18 
19 void main()
20 {
21     PE a[N];
22     init(a, N);                    //对人物信息进行初始化
23 
24     int total = N;                //剩余人数,初始化为N
25     int num = 1;                //报数器
26     PE *p = &a[0];
27     for (PE*pPrior = &a[N - 1]; total != 1; p = p->pNext)        //是一个圈 pPrior指向当前结点的前一个结点
28     {
29         if (num != 3){
30             num++;
31             pPrior = pPrior->pNext;                        //前结点向后移一个单位
32             continue;
33         }
34         else
35         {
36             pPrior->pNext = p->pNext;                    //删除当前结点
37             num = 1;
38             total--;                                    //生剩余人数--,当人数剩余为1时循环结束
39         }
40         num++;//因为得往后走了 值前赋值了了1 回到循环向后移动
41     }
42     printf("%d", p->ID);
43     system("pause");
44 }
45 
46 void init(PE a[], int n)
47 {
48     for (int i = 0; i < n; i++)
49     {
50         a[i].ID = i + 1;            //每个人的编好
51         if (i != n - 1)
52         {
53             a[i].pNext = &a[i + 1];        //将下一个的地址赋给pNext
54         }
55         else
56         {
57             a[i].pNext = &a[0];            //将序号为1的地址赋给最后一个元素的pNext
58         }
59     }
60 }

原文地址:https://www.cnblogs.com/lanjianhappy/p/6533325.html