约瑟夫环问题

简介:

直接上C++代码:

这里有问题的地方就是joseph_circle.cpp实现方法eliminate的循环语句的条件,如果把p->next != p改为p->next != nullptr就会出现循环已经删除了最后一个还继续循环,还继续删除,然后抛出空指针异常。

joseph_circle.h

复制代码
 1 #ifndef __YueHeFuHuan__joseph_circle__
 2 #define __YueHeFuHuan__joseph_circle__
 3  4 #include <stdio.h>
 5 #include <iostream>
 6 using namespace std;
 7 struct node{
 8 int payload;
 9 node* next;
10 node(int value){
11 payload = value;
12 }//通过构造器传值更好,更直观。 13 };
14 15 class joseph_circle{
16 public:
17  joseph_circle();
18 node* tail;
19 void add(int n);
20 void output();
21 void eliminate(int step);
22 };
23 24 25 #endif /* defined(__YueHeFuHuan__joseph_circle__) */
复制代码

joseph_circle.cpp

复制代码
 1 #include "joseph_circle.h"  2  3 joseph_circle::joseph_circle(){
 4 tail = nullptr;
 5 }
 6 void joseph_circle::add(int value){
 7 if (tail == nullptr) {
 8 tail = new node(value);
 9 tail->next = tail;
10 }else{
11 node* next_node = tail->next;
12 tail->next = new node(value);
13 tail = tail->next;
14 tail -> next = next_node;
15 16  }
17 }
18 void joseph_circle::output(){
19 if (tail == nullptr) {
20 cout << "链表为空!" << endl;
21 }else{
22 node* p = tail->next;
23 while (true) {
24 cout << "payload:" << p->payload << endl;
25 if (p == tail) {
26 break;
27  }
28 p = p->next;
29  }
30  }
31 }
32 void joseph_circle::eliminate(int step){
33 if (tail == nullptr) {
34 cout << "链表为空!" << endl;
35 }else{
36 node* p = tail;
37 node* delete_p;
38 //事实证明,当delete一个指针之后,其指针指向不为空 39 while (p != nullptr && p->next != p) {
40 //根据步长找到目标元素 41 for (int i=0; i<step-1; i++) {
42 p = p->next;
43  }
44 delete_p = p->next;
45 cout << "deleting: " << delete_p->payload << endl;
46 p->next = delete_p->next;
47 if (delete_p == tail) {
48 tail = p;
49  }
50 delete delete_p;
51 52  }
53  }
54 }
复制代码

相关文章
|
存储 安全 Python
Python中临时文件的妙用
Python中临时文件的妙用
150 0
|
机器学习/深度学习 数据可视化 PyTorch
【Deep Learning 5】FNN前馈神经网络
🍊本文详细介绍了FNN的原理,并给出了具体的推导过程🍊使用Pytorch搭建了FNN模型,并对糖尿病数据集开展分类任务实战。
1933 0
|
算法 数据格式
WLS算法的一个示例——实现美颜磨皮
WLS算法的一个示例——实现美颜磨皮
614 0
WLS算法的一个示例——实现美颜磨皮
|
机器学习/深度学习 运维 监控
用SLS配置日志关键字告警的N种方法
本文主要介绍一种免运维,高性能,支持灵活配置的方案,使用SLS接入日志和告警。
2418 1
用SLS配置日志关键字告警的N种方法
|
Java
Java反射之Method对象详解
使用Java反射,可以在运行时检查一个方法的信息以及在运行期调用这个方法,通过使用java.lang.reflect.Method类就可以实现上述功能。
553 0
|
14天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾