用双循环链表解决约瑟夫问题
来源:互联网 发布:2015全国意外事故数据 编辑:程序博客网 时间:2024/06/04 20:14
约瑟夫问题:犹太历史学家约瑟夫他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀。41个人站成一个圆圈,从第一个人开始数数,每次数到3,则该人自杀;然后下个人又从1开始数,然后数到3的人再自杀,依此下去...
单循环链表示意图:
说明:单循环链表可以要头结点也可以不要头结点
代码如下:
#include <iostream>using namespace std;typedef struct node{ int data; struct node *next;}Node, *pNode;pNode CreateCircleLink(int n); //创建一个有n个元素的循环链表,返回值为该链表的第一个节点的地址int GetNodeNumber(pNode first); //获取循环链表的节点个数int main(){ int n = 41; //约瑟夫问题中的人数,在本例中使用41 int m = 3; //约瑟夫问题中每隔几个人自杀一个,本例中取3 int num = n; //循环链表中剩余的节点个数 int i = 1; pNode p = CreateCircleLink(n); //p指向循环链表的第一个元素 while(num >= m) //当总人数小于m时,结束 { while(i < m - 1) { p = p->next; i++; } cout << p->next->data << "->"; pNode temp = p->next; p->next = temp->next; delete temp; p = p->next; num = GetNodeNumber(p); i = 1; } num = GetNodeNumber(p); while(num > 1) { cout << p->data << "->"; p = p->next; num--; } cout << p->data; return 0;}pNode CreateCircleLink(int n) //创建一个有n个元素的循环链表{ pNode pHead = new Node; pNode p = pHead; pNode pNew; for(int i=0; i<41; i++) { pNew = new Node; pNew->data = i + 1; p->next = pNew; p = pNew; } pNew->next = pHead->next; delete pHead; return pNew->next;}int GetNodeNumber(pNode first) //获取循环链表剩余节点的个数{ int num = 1; pNode p = first; while(p->next != first) { p = p->next; num++; } return num;}运行结果:
0 0
- 用双循环链表解决约瑟夫问题
- 双循环链表解决耶稣门徒问题
- 用循环链表解决约瑟夫问题
- 用循环链表解决约瑟夫问题
- 链表解决约瑟夫问题
- 用单向循环链表解决约瑟夫环问题
- 用个循环链表解决约瑟夫环问题
- [转]用单向循环链表解决约瑟夫环问题
- 用循环链表解决约瑟夫(josephu)问题
- 约瑟夫环问题 (用循环链表解决)
- 用循环链表解决约瑟夫环问题
- 用循环单链表解决约瑟夫问题
- 用链表解决约瑟夫(Josephus)问题
- .Net用循环链表解决约瑟夫问题
- 排队(约瑟夫问题)用循环链表解决
- C语言用链表解决约瑟夫问题
- C语言用循环链表解决约瑟夫问题
- c++ 数据结构 用循环单链表解决约瑟夫问题
- eclipse 配置 tomcat 8.0
- java,jsp,的数据库日期操作杂记
- 创建第一个android工程
- Java双精度相乘,结果错误的解决
- 81 Java RunTime类
- 用双循环链表解决约瑟夫问题
- WebService名词解释
- iOS:从xib文件中加载Cell
- Delphi如何检测Form的移动和调整尺寸事件
- C++primer学习笔记(6)
- 微芯片科技推出具备USB和触摸传感的16位MCU
- 经典算法——回溯
- 二进制文件与纯文本文件
- 开发者工具