要努力变更好 2022-07-04 17:34 采纳率: 100%
浏览 54
已结题

约瑟夫退圈问题长时间等待

问题遇到的现象和发生背景

运行时间足足两分钟

问题相关代码,请勿粘贴截图
#include<iostream>
#include<vector>
using namespace std;
vector<int>del;//存储被删除节点的val

class Node
{
public:
    Node(int x) :val(x), next(NULL) {}//构造函数
    bool is_used = false;//标记该点是否被删除
    int val = 0;//节点数值
    Node* next;
};
Node* head = new Node(-1);
class CircleList
{
public:
    void init()//初始化循环链表
    {
        head->next = head;
        int num;
        cout << "请输入参与人数" << endl;
        cin >> num; lenth = num;
        int m;
        cout << "请输入喊第几个的人退出" << endl;
        cin >> m;
        
        for (int i = 1; i <= num; i++)insert(i);//将1-num插入到链表中
    }
    void insert(int n)//插入节点
    {
        Node* temp = head;
        while (temp->next != head)
        {
            temp = temp->next;
        }
        Node* p = new Node(n);
        temp->next = p;
        p->next = head;
    }
    void start()//开始报数
    {
        int cnt = 0;
        for (Node* i =head->next ; lenth > 0; i = i->next)
        {
            
            if (i == head)//遇到头节点跳过
            {
                i = i->next;
            }
            if (lenth >= m&&!(i->is_used))//如果剩余长度大于m,并且这个数没有被用过,进行报数
            {
                    cnt++;
                    if (cnt == m)//当报到m,删除该节点
                    {
                        i->is_used = true;
                        lenth--;
                        del.push_back(i->val);
                        cnt = 0;
                    }
            }
            else//剩余个数不足,直接删除
            {
                del.push_back(i->val);
                lenth--;
            }
        }
    }
    
    void show()//展示删除次序
    {
        cout << "===============" << endl;
        cout << "退出顺序如下" << endl;
        for (auto x : del)
        {
            printf("%d ", x);
        }
    }
private:
    int lenth=0;//链表长度
    int  m=0;//报到第几个数字被移除
};
int main()
{ 
        CircleList cirlist;//创建对象
            cirlist.init();
            cirlist.start();
            cirlist.show();
        return 0;
}

运行结果及报错内容

等待很长时间,才会输出一串错误的

我的解答思路和尝试过的方法

头节点开始定义在类list内作为数据成员,但发现报错,就定义在外面
start函数一直循环,不知道问题所在

我想要达到的结果

对于循环链表,head定义在哪里更好,如何正确输出答案

  • 写回答

2条回答 默认 最新

  • 天际的海浪 2022-07-04 17:45
    关注

    等待很长时间是死循环了
    m 是类的成员属性, 不要在init()中再定义m变量

    
        void init()//初始化循环链表
        {
            head->next = head;
            int num;
            cout << "请输入参与人数" << endl;
            cin >> num; lenth = num;
            //int m;      去掉这行
            cout << "请输入喊第几个的人退出" << endl;
            cin >> m;
    
            for (int i = 1; i <= num; i++)insert(i);//将1-num插入到链表中
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月12日
  • 已采纳回答 7月4日
  • 创建了问题 7月4日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号