约瑟夫环问题

简介:

直接上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 }
复制代码

相关文章
|
1月前
|
机器学习/深度学习
约瑟夫环
【10月更文挑战第11天】
56 5
|
1月前
约瑟夫环问题
约瑟夫环
23 0
|
存储 算法
约瑟夫环问题的几种解法
约瑟夫环问题的几种解法
100 0
|
算法
约瑟夫环问题(三种方法)
约瑟夫环问题(三种方法)
144 0
|
Java
(五)Java数据结构之循环链表解决约瑟夫(Josephus)环问题
(五)Java数据结构之循环链表解决约瑟夫(Josephus)环问题
104 0
|
算法 索引 Python
细究“约瑟夫环”
细究“约瑟夫环”
97 0
|
算法 Java
算法 | 链表的应用,约瑟夫问题
算法 | 链表的应用,约瑟夫问题
130 0
算法 | 链表的应用,约瑟夫问题