数据结构与算法——循环链表的算法实现(Joseph 问题)
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 问题)的更多相关文章
- 数据结构与算法系列----最小生成树(Prim算法&Kruskal算法)
一:Prim算法 1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Ve ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较
javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...
- hdu 3336:Count the string(数据结构,串,KMP算法)
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- ipmi常用的命令行命令
前言 记录一些常用的命令行操作 命令 查询机器的电源状态 ipmitool -I lanplus -U admin -P admin -H 172.16.21.215 power status 硬重启 ...
- arm-linux 修改rootfs登录名和密码
1.保证文件系统busybox中已经配置了login登录功能. 2.修改命令行前缀名 (1)进到/etc/sysconfig,找到HOSTNAME文件,修改里面为想要的登录名后,之后再重新加载文件系统 ...
- 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片
目录 第一部分:Consul 基础 1,Consul 介绍 2,安装 Consul Ubuntu/Debian 系统 Centos/RHEL 系统 检查安装 3,运行 Consul Agent 启动 ...
- a标签中的target
html中target四种选择_blank._parent._self._top,分别是什么意思? eg:<Cell title="Open link in new window&qu ...
- Java基础—Java方法的调用
Java方法的调用个主要有以下几种: 1.调用非静态方法 2.调用静态方法 3.方法与方法之间的调用 (1).静态方法内部调用其他方法 (2).非静态方法内部调用 1.调用非静态方法: 非静态方法的调 ...
- 打包错误:Failed to execute goal org.scala-tools:maven-scala-plugin:2.15.2:compile (default) on project MusicProject: wrap: org.apache.commons.exec.ExecuteException:
错误:Failed to execute goal org.scala-tools:maven-scala-plugin:2.15.2:compile (default) on project Mus ...
- jQuery 第五章 实例方法 详解内置队列queue() dequeue() 方法
.queue() .dequeue() .clearQueue() ------------------------------------------------------------------ ...
- api4excel - 接口自动化测试excel篇
api4excel - 接口自动化测试excel篇 工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务 ...
- Codeforces Round #667 (Div. 3) B、C、D、E 题解
抱歉B.C题咕了这么久 B. Minimum Product #枚举 #贪心 题目链接 题意 给定四个整数\(a, b, x, y\),其中\(a\geq x, b\geq y\),你可以执行不超过\ ...
- X86中断/异常与APIC
异常(exception)是由软件或硬件产生的,分为同步异常和异步异常.同步异常即CPU执行指令期间同步产生的异常,比如常见的除零错误.访问不在RAM中的内存 .MMU 发现当前虚拟地址没有对应的物理 ...