zoukankan      html  css  js  c++  java
  • 约瑟夫环问题

    直接上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 }
     
  • 相关阅读:
    C#制作在线升级程序
    C#中使用GUID的笔记
    C# WinForm 上传图片,文件到服务器的方法Uploader.ashx
    Java学习---多线程的学习
    Java学习---异常处理的学习
    Java学习---TCP Socket的学习
    Java学习---IO操作
    Java学习---JAVA的类设计
    Java学习---InetAddress类的学习
    Java学习---面向对象的远程方法调用[RMI]
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/4704822.html
Copyright © 2011-2022 走看看