Joseph 问题:

如果有10 个人,按编号顺序1,2,。。。,10 顺时针方向围成一圈。从1 号开始顺时针方向1,2,。。。,9 报数,凡报数9 者出列(显然,第一个出圈为编号9 者)。

最后一个出圈者的编号是多少?

第5 个出圈者的编号是多少?z

.

代码实现

  1 #include<iostream>
2 #include<string>
3 #include<stdlib.h>
4
5 using namespace std;
6
7 typedef struct _LinkNode
8 {
9 int data; //结点的数据域
10 struct _LinkNode* next; //结点的指针域
11 }LinkNode, LinkList; //LinkList 为指向结构体LNode 的指针类型
12
13 void LinkPrint(LinkList* L);
14
15 bool InitList(LinkList*& L) //构造一个空的循环链表L
16 {
17 L = new LinkNode; //生成新结点作为头结点,用头指针L 指向头结点
18 if (!L)return false; //生成结点失败
19 L->next = L; //头结点的指针域指向自己
20 L->data = -1;
21 return true;
22 }
23
24 //尾插法
25 bool ListInsert_back(LinkList*& L, LinkNode* node)
26 {
27 LinkNode* last = NULL;
28 if (!L || !node) return false;
29
30 //找到最后一个节点
31 last = L;
32 while (last->next != L) last = last->next;
33
34 //新的节点链接到最尾部
35 node->next = L;
36 last->next = node;
37
38 return true;
39 }
40
41 bool Joseph(LinkList*& L, int interval)
42 {
43 //在带头结点的循环链表L 中,每个interval 个间隔循环删除节点
44 LinkList* p, * q;
45 int j = 0, i = 0;
46 int times = 0, num = 0;
47 p = L;
48
49 if (!L || p->next == L) {
50 cout << "链表为空!" << endl;
51 return false;
52 }
53
54 if (interval < 1)
55 {
56 cout << "报数淘汰口令不能小于1!" << endl;
57 return false;
58 }
59
60 do
61 {
62 i += interval;
63 while ((p->next)) //查找第i 个结点,p 指向该结点的上一个节点
64 {
65 if (p->next != L) j++;
66 if (j >= i) break;
67 p = p->next;
68 }
69 times++;
70
71 /*if (!(p->next)||(j>i))//当i>n 或i<1 时,删除位置不合理
72 return false;*/
73
74 q = p->next; //临时保存被删结点的地址以备释放空间
75 num = q->data;
76 if (times == 5)cout << "第 5 个出圈的编号是:" << num << endl;
77 printf("cur: %d last: %d next:%d\n", q->data, p->data, q->next->data);
78 p->next = q->next; //改变删除结点前驱结点的指针域
79 delete q; //释放被删除结点的空间
80 LinkPrint(L);
81 } while (L->next != L); //链表不为空,继续报数
82 cout << "最后一个出圈的编号是:" << num << endl;
83
84 return true;
85 }
86
87 void LinkPrint(LinkList* L) //循环链表的输出
88 {
89 LinkList* p;
90 if (!L || L == L->next) {
91 cout << "链表为空!" << endl;
92 return;
93 }
94 p = L->next;
95 while (p != L)
96 {
97 cout << p->data << "\t";
98 p = p->next;
99 }
100 cout << endl;
101 }
102
103 int main()
104 {
105 int i, x;
106 LinkList* L;
107 LinkNode* s;
108
109 //1. 初始化一个空的循环链表
110 if (InitList(L))
111 {
112 cout << "初始化一个空的循环链表!\n";
113 }
114
115 //2. 创建循环链表(尾插法)
116 std::cout << "尾插法创建循环链表, 插入 10 个元素..." << endl;
117 i = 0;
118
119 while ((++i) <= 10)
120 {
121 s = new LinkNode;//生成新结点
122 s->data = i; //输入元素值赋给新结点的数据域
123 s->next = NULL;
124 if (ListInsert_back(L, s)) {
125 cout << "插入成功!" << endl;
126 }
127 else {
128 cout << "插入失败!" << endl;
129 }
130 }
131
132 cout << "尾插法创建循环链表输出结果:\n";
133 LinkPrint(L);
134
135 //3. 解答约瑟夫问题
136 Joseph(L, 9);
137 system("pause");
138 return 0;
139 }

===================================================================================================================

数据结构与算法——循环链表的算法实现(Joseph 问题)的更多相关文章

  1. 数据结构与算法系列----最小生成树(Prim算法&amp;Kruskal算法)

     一:Prim算法       1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Ve ...

  2. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  3. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  4. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  5. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  6. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  7. 数据结构与算法--最短路径之Bellman算法、SPFA算法

    数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...

  8. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  9. hdu 3336:Count the string(数据结构,串,KMP算法)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. rbd的image快照与Pool快照

    前言 这个问题是不久前在ceph社区群里看到的,创建image的时候,当时的报错如下: 2016-12-13 23:13:10.266865 7efbfb7fe700 -1 librbd::image ...

  2. 转载 Web前端开发 HTML设计 经验与技巧总结

    文章目录1.限制input 输入框只能输入纯数字.限制长度.默认显示文字2.input输入框自动获取焦点3.用CSS让背景有透明度文字不变4.a标签禁止点击5.文字两种居中对齐6.设置一个元素一直在页 ...

  3. Mysql预处理语句prepare、execute、deallocate

    前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...

  4. CURLOPT_FOLLOWLOCATION

    curl爬取过程中,设置CURLOPT_FOLLOWLOCATION为true,则会跟踪爬取重定向页面,否则,不会跟踪重定向页面

  5. SpringSecurity了解

    在web开发中,安全第一位!!过滤器.拦截器~ 属于非功能性需求. 做网站:安全应该在什么时候考虑?设计之初!! 漏洞,隐私泄露~ 假设架构一旦确定~ shiro和SpringSecurity的区别: ...

  6. mac实用软件推荐 mac好用的软件

    终于入手了梦寐以求的苹果电脑,但却发现其操作系统与Windows大相径庭!不会使用怎么办?不用担心,我们可以借助软件的力量.一款实用的Mac软件不仅能够使你的工作效率显著提高,同时它还能帮助你更快地熟 ...

  7. 如何在MathType输入手写体a

    作为强大的数学公式编辑器,MathType中还能设置各种样式,还支持自定义设置,给大家编辑公式提供了更多的便利.那么有用户问:要如何将输入的字母a变为手写体呢?下面就来一起学习. 输入手写体a的步骤如 ...

  8. 「LOJ 3153」 「JOI Open 2019」三级跳

    题面 LOJ 3153 solution 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优. 故只需要考虑 ...

  9. Word1-提取图片文字

    1.OneNote # 将图片以图片格式粘贴在OneNote中-右键选择"复制图片中的文本"-粘贴"只保留文本"即可 这种方式识别率较高!!! 2.手机QQ图片 ...

  10. pytest参数化

    Pytest可以在多个级别上实现测试参数化 一.@pytest.fixture装饰器调用参数 示例 import pytest from selenium import webdriver from ...