C语言实现猴子选大王算法

需积分: 15 1 下载量 198 浏览量 更新于2024-09-16 收藏 866B TXT 举报
"猴子选大王问题 - 一个简单的猴子选大王程序,正确高效的完成!" 这个程序是解决“猴子选大王”问题的一个实现,它基于链表数据结构。猴子选大王游戏通常指的是这样的规则:有n个猴子围成一圈,每次从第m个猴子开始顺时针数到第m个猴子被剔除,直至只剩下一个猴子,这个猴子即为大王。这里n代表猴子的数量,m是每次剔除的间隔。 首先,程序定义了一个结构体`Monkey`,用于存储猴子的信息,包含两个成员:`num`表示猴子的编号,`next`是一个指针,指向下一个猴子。`typedef`关键字用来创建别名`link`,使得我们可以更方便地操作`Monkey`结构体的指针。 接下来,`main`函数是程序的入口。在这里,首先分配内存来初始化链表,`head`、`p`和`q`都是指向`Monkey`结构体的指针,`newmonkey`是一个简化的内存分配过程,用`malloc`分配内存并初始化`Monkey`结构体。 然后,通过一个for循环创建了n个猴子,并将它们链接成一个环形链表。链表的最后一个节点的`next`指针指向头节点,形成一个循环。 在链表构建完成后,程序打印出所有猴子的初始顺序,以便于观察游戏过程。 接下来,游戏开始。一个无限循环`while(1)`用来模拟游戏的进行,`i`变量记录了当前的轮数。在每一轮中,会打印出被剔除的猴子编号(即当前轮数)以及当前猴子的编号。如果`i<m`,则继续顺时针移动;如果`i==m-1`,则保存当前猴子的前一个节点`q`,因为下一轮可能需要剔除它;如果`i==m`,说明到了剔除的猴子,更新链表结构,剔除当前猴子,`i`重置为0,并继续下一轮游戏。 最后,当链表只剩下一个猴子(即头节点和尾节点相等)时,跳出循环,输出最后剩下的猴子编号,即大王。 这个程序实现了猴子选大王问题的算法,通过链表操作减少了不必要的遍历,提高了效率。它适用于理解链表数据结构的应用和循环链表的操作,以及掌握游戏逻辑的编程实现。