题目: 下面的程序演示了单向循环链表的建立和表结点的删除,我们要求解的问题如右图所示:猴子选大王。有N 只猴子,从1 到N 进行编号。它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数。第一只猴子报的第一个数字为 1,以后每只猴子报的数字都是它前面猴子所报的数字加1。如果一只猴子报的数字是M,则该猴子出列,下一只猴子重新从1 开始报数。剩下的猴子继续排成一个圆圈报数,直到全部的猴子都出列为止。最后一个出列的猴子胜出。 以下是代码: #include <iostream> using namespace std; struct Monkey { int ID; Monkey *next; }; int main() { Monkey *link, *monkey, *lastMonkey; int totalMonkeys, stride, count; printf("输入猴子的总数: "); scanf("%d", & totalMonkeys); printf("输入猴子报数的出队数字: "); scanf("%d", & stride); // 建立链表 link = NULL; for (int i = 0; i < totalMonkeys; i++) { monkey = new Monkey; monkey->ID = i + 1; if(link == NULL) //链表为空,加入第一只猴子 link = lastMonkey = monkey; else { //链表中已有结点,将新的猴子加入到链表的末尾 lastMonkey->next = monkey; lastMonkey = monkey; } } lastMonkey->next = link; //将链表的最后一个结点指向它的第一个结点 // 计算猴子出队的顺序 count = 1; printf("猴子出队的顺序: "); while(link != NULL) { if(link->next == link) { // 只剩下最后一只猴子 printf("%4d/n", link->ID); delete link; break; } if(count == stride-1) { // link 指向的猴子之后的那只猴子要出队 monkey = link -> next; // 让monkey指向的猴子出队 link->next = monkey->next; printf("%4d", monkey->ID); delete monkey; count = 0; } link = link->next; count ++; } return 0; } C++奋斗乐园①群(已满):19333724 C++奋斗乐园②群:23840480 我们的论坛(刚建立。。。) http://www.cppleyuan.com/ (C++奋斗乐园)