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. 从ceph对象中提取RBD中的指定文件

    前言 之前有个想法,是不是有办法找到rbd中的文件与对象的关系,想了很久但是一直觉得文件系统比较复杂,在fs 层的东西对ceph来说是透明的,并且对象大小是4M,而文件很小,可能在fs层进行了合并,应 ...

  2. @Autowired自动装配原理

    在类中为类名添加 @Auwowired注解,为该类在spring中注册成组件 1,先按照类型在容器中找对应的组件:找到一个, 直接赋值,一个都没找到, 抛异常 2,找到了多个:按变量名作为ID继续匹配 ...

  3. Nacos一致性算法

    1. CAP原则 又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance).CAP 原则指的 ...

  4. BUUCTF 不一样的flag writeup

    感谢BUUCTF提供的学习平台 https://buuoj.cn 题目:不一样的flag 工具:x64dbg 这是一道内存的迷宫题,迷宫是402000处的字符串 根据经验,这应该(a行*b列)的字符, ...

  5. CDR排钻教程-CorelDRAW服装设计中的排钻技术

    服装设计一直都是一个很火热的行业,也是一个比较高端的行业,随着时代的步伐,以前的人都是用手绘的方式来设计服装,现在不一样了,电脑可以说普及到了每一个家庭,让软件以更快的速度,更准确的数据来设计服装中的 ...

  6. FL Studio录制面板知识讲解

    FL Studio录制面板可以设置与录制有关的选项,它还有一个用来设置音符对齐的全局吸附选择器.刚接触水果这款音乐制作软件的同学通常不是很清楚这里的知识的,下面小编就给大家讲解一下. 1.首先,我们来 ...

  7. Educational Codeforces Round 92 (Rated for Div. 2) B、C题解

    TAT 第一场codeforces B. Array Walk #暴力 #贪心 题目链接 题意 有\(a1, a2, ..., an\) 个格子(每个格子有各自分数),最初为1号格(初始分数为\(a1 ...

  8. C语言讲义——errno

    #define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #defi ...

  9. redis 客户端

    输入缓冲区: 客户端状态的输入缓冲区用于保存客户端发送的命令请求: typedef struct redisClient{ //... sds querybuf; //... }redisClient ...

  10. CentOS7配置时间和CentOS6搭建局域网NTP

    NTP 2015年8月20日 星期四 17:34 CentOS 7配置本地时区和TIME ZONE #用tzselect配置时区和time zone [root@localhost Asia]# /u ...