关于该问题简单描述:
假设有n个人排成一个圈。从第一个人开始报数,数到第m个人的时候这个人从队列里出列。然后继续在环里数后面第m个人,让其出列直到所有人都出列。最后一个出列的是胜出者。下面用链表模拟n个同学手拉手围成一个圈。如果m为1的话,该游戏没有了意思,因为这样的话,第n个人一定是胜出者,所以排除这种情况。解决该问题,有很多方法,本方法用的是循环单链表。如有不当之处,请读者指正!
点击(此处)折叠或打开
- #include<iostream>
- //#include<stdlib.h>
- using namespace std;
-
- struct Note {
-
- int data;
- struct Note *next;
-
- };
-
- Note *CreateNote() {
-
- Note *first;
- first = new Note; //first = (Note *)malloc(sizeof(Note));
- first ->data = NULL; //创建头结点,并且不存放任何值
- return first;
- }
-
- Note *InitNote(Note *first, int n) {
-
- Note *head, *p;
- head = first;
-
- p = NULL;
-
- cout << "同学开始座次:" << endl;
-
- for (int i = 1; i <= n; i++) { //利用尾插法,构造链表
-
- p = new Note;
- head->next = p;
- p->data = i;
- cout << p->data << "--> ";
- head = p;
- }
-
- p->next = first->next; //形成换
- return first; //返回头结点
- }
-
- void Search(Note *q, int m) {
-
- cout << "依次出列同学:";
- if (m == 1) { //如何查找间隔为1,则终止程序
-
- cout << "游戏太无聊!";
- exit(-1);
- }
-
- for (int i = 1; q != q->next; q = q->next, i++) {
-
- if (i == m) { //当i = m时,执行其中的语句,并初始化i = 1,至于原因,读者画图便可知
-
- i = 1;
- Note *n;
- n = q->next;
- cout << q->next->data << "--> ";
- q->next = n->next;
- delete n;
-
- }
- }
-
- cout << q->data;
- cout << endl;
- cout << "获胜的是:" << q->data << "号同学" << endl;
-
- }
- int main() {
-
- Note *p, *q;
- p = CreateNote();
- q = InitNote(p, 5);
- cout << endl;
- Search(q, 2);
- }
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29876893/viewspace-1815055/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29876893/viewspace-1815055/