C++链表读取访问异常


#include<iostream>
using namespace std;


//定义结点类
class Node
{
public:
    int data;
    Node* next;
};

//定义约瑟夫环类
class Joseph
{
public:
    //构造函数初始化n个结点的循环单链表
    Joseph(int n);
    //析构函数
    ~Joseph();
    //根据密码m,打印出环顺序的函数
    void JosephPrint(int m);
private:
    //成员变量为尾指针
    Node* rear;
};


//构造函数的实现
Joseph::Joseph(int n)
{
    //定义一个临时指针,便于插入元素时使用
    Node* s = nullptr;
    //new一个rear指针
    rear = new Node;
    rear->next = nullptr;
    //建立长度为1的循环单链表
    rear->data = 1;
    rear->next = rear;
    //插入数据域为1—n的结点
    for (int i = 2; i <= n; i++)
    {
        s = new Node;
        s->data = i;
        s->next = rear->next;
        rear->next = s;
        rear = s;
    }
}

void Joseph::JosephPrint(int m)
{
    //定义两个工作指针per,p分别指向尾指针所在结点和尾指针的后继结点
    Node* per = rear;
    Node* p = rear->next;
    //初始化计数器为1
    int count = 1;
    //利用循环,当循环m次后删除p所在结点,然后将计数器重置为1再次循环
        while (p->next != p)  //当p->next=p时说明循环链表中没有元素了,即循环结束
    {
        if (count < m)
        {
            per = p;
            p = p->next;
            count++;
        }
        else
        {
            //也即是当数到m时,p所指向的结点应该删除掉
            cout << p->data << endl;
            per->next = p->next;  //删除p结点,将p摘链
            delete p;
            p = per->next;  //p重新指向per的后继结点
            count = 1;      //将count重新赋值1,找下一个出环的数据元素
        }
        cout << p->data << endl;  //输出最后一个出环的元素
        delete p;                 //最后一个数据元素出环
    }
}
Joseph::~Joseph()
{

}

int main()
{
    //主函数中输入约瑟夫环长度n和密码m,并定义类对象
    int n, m;
    cout << "请输入约瑟夫环长度:" << endl;
    cin >> n;
    cout << "请输入密码:" << endl;
    cin >> m;
    //定义类对象circle
    Joseph circle(n);
    circle.JosephPrint(m);

    system("pause");
    return 0;
}


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/58357175623612.png "=600 #left")

while循环那里显示读取访问异常,p是0x8123,求大佬帮助

while中的else结束时应该加continue;不然会执行最后的两句,肯定是不对的
另外这最后两句是不是应该放到循环外呢