#include<iostream> #include<iomanip> using namespace std; struct Boy// { int code; Boy*pNext; }; Boy*pFirt = 0;//第一个小孩指针 Boy*pCurrent = 0;//当前小孩指针 Boy*pivot = 0;//前一个小孩指针 void main(){ //游戏的初值 int numOfBoys, m; cout << "please input the number of boys,\n"//小孩数 << "m of counting:\n";//数小孩个数 cin >> numOfBoys >> m; //在圆圈中增加第一个小孩,在堆区中开辟一个空间 pFirt = new Boy; pFirt->code = 1; pFirt->pNext = NULL;//后面没有小孩 pCurrent = pFirt;//两个指向的地址一样。 //依次增加其他小孩 for (int i = 1; i < numOfBoys; i++){ pivot = pCurrent;//当前小孩变成前小孩 pCurrent = new Boy; pCurrent->code = i + 1;//小孩编号 pivot->pNext = pCurrent;//接到前一个小孩后面 } pCurrent->pNext = pFirt;//最后一个小孩指向第一个小孩 //输出圆圈中所有小孩 cout << setw(4) << pFirt->code;//输出当前小孩 pCurrent = pFirt->pNext; while (pCurrent != pFirt){ cout << setw(4) << pCurrent->code;//输出当前小孩 pCurrent = pCurrent->pNext; } cout << endl; pCurrent = pFirt; int j; while (pCurrent->pNext != pCurrent){ //需要数的小孩数j=m j = m; do{ //当前位置调整到下一个小孩 pivot = pCurrent;//当前小孩变成前一个小孩 pCurrent = pCurrent->pNext; j--; } while (j > 1);//当前小孩数1,再往后数m-1个 //第m个小孩离开 cout << setw(4) << pCurrent -> code; pivot->pNext = pCurrent->pNext;//当前小孩的下一个小孩跟在他前一个的后面 delete pCurrent;//脱离圆圈后删除 pCurrent = pivot->pNext;//离开小孩的下一个小孩变为当前小孩 } cout << "\n\nthe winner is" << pCurrent->code<<endl;//获胜者 delete pCurrent; system("pause"); }解释该代码
时间: 2024-03-18 12:43:04 浏览: 61
这段代码是一个经典的约瑟夫问题的解法,求解约瑟夫问题的过程如下:
1. 输入小孩数和数小孩个数m。
2. 创建一个循环链表,链表中每个节点代表一个小孩,每个节点存储小孩编号和指向下一个小孩的指针。
3. 让当前小孩指针指向链表的第一个小孩,输出所有小孩的编号。
4. 从当前小孩开始,按照数小孩个数m进行循环,每数到m个小孩就把他删除,输出其编号,并删除该节点。
5. 当链表中只剩下一个小孩时,输出该小孩的编号,结束游戏。
具体实现过程:
1. 定义一个Boy结构体,包含小孩编号和指向下一个小孩的指针。
2. 定义三个指针,pFirt指向第一个小孩,pCurrent指向当前小孩,pivot指向前一个小孩。
3. 输入小孩数和数小孩个数m,创建循环链表,并输出所有小孩的编号。
4. 从当前小孩开始,循环数小孩个数m,每数到m个小孩就把他删除,输出其编号,并删除该节点。
5. 当链表中只剩下一个小孩时,输出该小孩的编号,结束游戏。
6. 释放内存。
值得注意的是,该代码存在一些问题,例如在结构体Boy中没有析构函数,可能会导致内存泄漏。此外,代码中有一些不规范的写法,例如在main函数中缺少返回值类型,需要改为int main()。
阅读全文