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. Appium常用操作之「Toast提示信息获取」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:Oschina.云+社区.知乎等各大平台都有. 目录 一.什么是 Toast 二.获取 Toast 提示信息的前提 1.针对这种元素,有的时候我们需要 ...

  2. 百度ping工具

    function postUrl($url, $postvar) { $ch = curl_init(); $headers = array( "POST".$url." ...

  3. .NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM

    介绍 sqlsugar已经在第一时间完美兼容.NET5并且已经有人在使用了, 很多人都担心用了开源框架遇到问题无法解决,导致前功尽弃,使用SqlSugar你大可放心,除了有详细文档和几年的大量用户积累 ...

  4. 关于C# Span的一些实践

    Span这个东西出来很久了,居然因为5.0又火起来了.   相关知识 在大多数情况下,C#开发时,我们只使用托管内存.而实际上,C#为我们提供了三种类型的内存: 堆栈内存 - 最快速的内存,能够做到极 ...

  5. 二 HTML文档基本结构

    2.1 HTML5文档结构: HTML5文档结构包括头部(head).主体(body)两大部分. 2.1.1<!DOCTYPE>声明 引用官方的DTD文件,在HTML5之前版本,如xHTM ...

  6. laravel数据填充

    post表有这2个字段 填充20条数据, 执行 php artisan tinker 执行预览 factory(App\Post::class,20)->make(); 插入数据库 factor ...

  7. Codeforces Round #674 (Div. 3) F. Number of Subsequences 题解(dp)

    题目链接 题目大意 给你一个长为d只包含字符'a','b','c','?' 的字符串,?可以变成a,b,c字符,假如有x个?字符,那么有\(3^x\)个字符串,求所有字符串种子序列包含多少个abc子序 ...

  8. 使用Docker部署MSSQL

    部署MSSQL需要2G内存 1.下载镜像 docker pull microsoft/mssql-server-linux 使用该命令就可以把数据库的docker镜像下载下来. 2.创建并运行容器 d ...

  9. Alpha冲刺-第二次冲刺笔记

    Alpha冲刺-冲刺笔记 这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 这个作业要求在哪里 https://edu.cnblogs. ...

  10. oracle 流程控制句式

    --for loop declare val number(10):=0; begin for val in 0..10 loop dbms_output.put_line('val='||val); ...