约瑟夫环(基于c++链表实现
)
#include <iostream>
using namespace std;
class person
{
public:
int number; //每个人的编号
person *next;
};
class Joseph
{
public:
Joseph(); //创建一个单链表
~Joseph(); //销毁单链表
void Create(int n); //创建环形链表
int delete_value(int value); //按值删除
void joseph(int n); //进行约瑟夫环出局
private:
person *head;
};
Joseph::Joseph() //初始化单链表
{
head = new person;
head->number = 0;
head->next = NULL;
}
Joseph::~Joseph() //销毁单链表
{
delete head; //删除头结点
}
void Joseph::Create(int n) //创建环形链表
{
person *p = head;
p->number = 1;
for (int i = 2; i <= n; i++)
{
person *newnode = new person;
newnode->number = i;
newnode->next = NULL;
p->next = newnode;
p = p->next;
}
p->next = head;
}
int Joseph::delete_value(int value) //按值删除
{
person *p = head;
person *ptr = p->next;
p->next = ptr->next;
delete ptr;
}
void Joseph::joseph(int n)
{
Create(n); //创建环形链表
int count = 1; //报数
while (n > 1)
{
count++;
if (count == 3)
{
cout << head->next->number << "出局" << endl;
delete_value(head->next->number);
count = 1;
n--;
}
head = head->next;
}
cout << "恭喜" << head->number << "活了下来!!!" << endl;
}
int main()
{
Joseph l;
int n; //初始人数
cout << "请确定初始人数:";
cin >> n;
l.joseph(n); //进行约瑟夫环出局
return 0;
}