#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;
}

while循环那里显示读取访问异常,p是0x8123,求大佬帮助
while中的else结束时应该加continue;不然会执行最后的两句,肯定是不对的
另外这最后两句是不是应该放到循环外呢