鱼C论坛

 找回密码
 立即注册
查看: 1743|回复: 2

[已解决]约瑟夫环打代码有bug

[复制链接]
发表于 2020-9-26 15:08:17 | 显示全部楼层 |阅读模式
5鱼币
/*********************************
  对应教材2.7.1节,约瑟夫环问题
**********************************/
#include<iostream>
using namespace std;

struct Node
{
        int data;
        struct Node* next;
};

class JosephRing
{
public:
        JosephRing();
        JosephRing(int n);
        ~JosephRing();
        void Joseph(int m);
private:
        Node* rear;
};
JosephRing::JosephRing()
{
        rear = NULL;
}

JosephRing::JosephRing(int n)
{
        Node* s = NULL;
        rear = new Node;
        rear->data = 1; rear->next = rear;
        for (int i = 2; i <= n; i++)
        {
                s = new Node; s->data = i;
                s->next = rear->next;
                rear->next = s;
                rear = s;
        }
}
JosephRing :: ~JosephRing()
{
        if (rear != NULL) {
                Node* p = rear->next;
                while (rear->next != rear)
                {
                        rear->next = p->next;
                        delete p;
                        p = rear->next;
                }
                delete rear;
        }
}

void JosephRing::JosephRing(int m)(错误:不能在构造函数上指定函数类型)
{
        Node* pre = rear, * p = rear->next;
        int count = 1;
        cout << "出环顺序是:";
        while (p->next != p)
        {
                if (count < m) {
                        pre = p; p = p->next;
                        count++;
                }
                else{
                        cout << p->data << "\t";
                        pre->next = p->next;
                        delete p;
                        p = pre->next;
                        count = 1;
                }
        }
        cout << p->data << "\t";
        delete p;
        rear = NULL;
}
int main()
{
        int n, m;
        cout << "请输入约瑟夫环的长度是:";
        cin >> n;
        cout << "请输入密码";
        cin >> m;
        JosephRing R(n);
        R.Joseph(m);
        return 0;
}
最佳答案
2020-9-26 15:08:18
本帖最后由 sunrise085 于 2020-9-26 15:36 编辑

第25行是构造函数,无返回值。
第52行,你把函数名写错了,把Joseph写成JosephRing了。前者是一般函数,后者是构造函数。
呃,请不要重复发帖。

  1. #include<iostream>
  2. using namespace std;

  3. struct Node
  4. {
  5.         int data;
  6.         struct Node* next;
  7. };

  8. class JosephRing
  9. {
  10. public:
  11.         JosephRing();
  12.         JosephRing(int n);
  13.         ~JosephRing();
  14.         void Joseph(int m);
  15. private:
  16.         Node* rear;
  17. };
  18. JosephRing::JosephRing()
  19. {
  20.         rear = NULL;
  21. }

  22. JosephRing::JosephRing(int n)
  23. {
  24.         Node* s = NULL;
  25.         rear = new Node;
  26.         rear->data = 1; rear->next = rear;
  27.         for (int i = 2; i <= n; i++)
  28.         {
  29.                 s = new Node; s->data = i;
  30.                 s->next = rear->next;
  31.                 rear->next = s;
  32.                 rear = s;
  33.         }
  34. }
  35. JosephRing :: ~JosephRing()
  36. {
  37.         if (rear != NULL) {
  38.                 Node* p = rear->next;
  39.                 while (rear->next != rear)
  40.                 {
  41.                         rear->next = p->next;
  42.                         delete p;
  43.                         p = rear->next;
  44.                 }
  45.                 delete rear;
  46.         }
  47. }

  48. void JosephRing::Joseph(int m)//你把函数名写错了,把Joseph写成JosephRing了。前者是一般函数,后者是构造函数
  49. {
  50.         Node* pre = rear, * p = rear->next;
  51.         int count = 1;
  52.         cout << "出环顺序是:";
  53.         while (p->next != p)
  54.         {
  55.                 if (count < m) {
  56.                         pre = p; p = p->next;
  57.                         count++;
  58.                 }
  59.                 else{
  60.                         cout << p->data << "\t";
  61.                         pre->next = p->next;
  62.                         delete p;
  63.                         p = pre->next;
  64.                         count = 1;
  65.                 }
  66.         }
  67.         cout << p->data << "\t";
  68.         delete p;
  69.         rear = NULL;
  70. }
  71. int main()
  72. {
  73.         int n, m;
  74.         cout << "请输入约瑟夫环的长度是:";
  75.         cin >> n;
  76.         cout << "请输入密码";
  77.         cin >> m;
  78.         JosephRing R(n);
  79.         R.Joseph(m);
  80.         return 0;
  81. }
复制代码

最佳答案

查看完整内容

第25行是构造函数,无返回值。 第52行,你把函数名写错了,把Joseph写成JosephRing了。前者是一般函数,后者是构造函数。 呃,请不要重复发帖。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-26 15:08:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-9-26 15:36 编辑

第25行是构造函数,无返回值。
第52行,你把函数名写错了,把Joseph写成JosephRing了。前者是一般函数,后者是构造函数。
呃,请不要重复发帖。

  1. #include<iostream>
  2. using namespace std;

  3. struct Node
  4. {
  5.         int data;
  6.         struct Node* next;
  7. };

  8. class JosephRing
  9. {
  10. public:
  11.         JosephRing();
  12.         JosephRing(int n);
  13.         ~JosephRing();
  14.         void Joseph(int m);
  15. private:
  16.         Node* rear;
  17. };
  18. JosephRing::JosephRing()
  19. {
  20.         rear = NULL;
  21. }

  22. JosephRing::JosephRing(int n)
  23. {
  24.         Node* s = NULL;
  25.         rear = new Node;
  26.         rear->data = 1; rear->next = rear;
  27.         for (int i = 2; i <= n; i++)
  28.         {
  29.                 s = new Node; s->data = i;
  30.                 s->next = rear->next;
  31.                 rear->next = s;
  32.                 rear = s;
  33.         }
  34. }
  35. JosephRing :: ~JosephRing()
  36. {
  37.         if (rear != NULL) {
  38.                 Node* p = rear->next;
  39.                 while (rear->next != rear)
  40.                 {
  41.                         rear->next = p->next;
  42.                         delete p;
  43.                         p = rear->next;
  44.                 }
  45.                 delete rear;
  46.         }
  47. }

  48. void JosephRing::Joseph(int m)//你把函数名写错了,把Joseph写成JosephRing了。前者是一般函数,后者是构造函数
  49. {
  50.         Node* pre = rear, * p = rear->next;
  51.         int count = 1;
  52.         cout << "出环顺序是:";
  53.         while (p->next != p)
  54.         {
  55.                 if (count < m) {
  56.                         pre = p; p = p->next;
  57.                         count++;
  58.                 }
  59.                 else{
  60.                         cout << p->data << "\t";
  61.                         pre->next = p->next;
  62.                         delete p;
  63.                         p = pre->next;
  64.                         count = 1;
  65.                 }
  66.         }
  67.         cout << p->data << "\t";
  68.         delete p;
  69.         rear = NULL;
  70. }
  71. int main()
  72. {
  73.         int n, m;
  74.         cout << "请输入约瑟夫环的长度是:";
  75.         cin >> n;
  76.         cout << "请输入密码";
  77.         cin >> m;
  78.         JosephRing R(n);
  79.         R.Joseph(m);
  80.         return 0;
  81. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-26 15:11:21 | 显示全部楼层
sunrise085 发表于 2020-9-26 15:10
第52行,你把函数名写错了,把Joseph写成JosephRing了。前者是一般函数,后者是构造函数。
呃,请不要重复 ...

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表