这个题目采用的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 }