这个题目采用的2个指针,链表涉及到删除 通常都会用其中一个指针保存前面的地址 紧跟着
1 //功能:13个人围成一圈,从第一个人开始顺序报号1、2、3。 2 //凡报到“3”者退出圈子。找出最后留在圈子里的人原来的序号。 3 4 #include5 #include 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; //剩余人数,初始化为N25 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 else35 {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]; //将下一个的地址赋给pNext54 }55 else56 {57 a[i].pNext = &a[0]; //将序号为1的地址赋给最后一个元素的pNext58 }59 }60 }