不写抽卡小游戏了,因为我能力就到这儿了…
记录下我造轮子好了…
约瑟夫环实现:
n个人,从第一个人开始报数,第m个人出环,然后从下一个人开始数继续报数直到第m个人。
存储结构:
采用循环单链表,出环则删除链表
具体实现:
双指针p和q,p指向当前结点,q指向p的下一结点
设置count,若count<m则p和q同时后移且count++
直到count=m,将q所指结点数据输出,并删除q指向的结点
count初始化,重复以上操作直到链表中只剩一个结点
将最后一个结点输出并删除结点,结束程序
代码实现:
#include<iostream>
using namespace std;
struct Listnode {
int val;
Listnode* next;
};
class JosephRing {
public:
JosephRing(int n);
void Joseph(int m);
void print(Listnode* rear);
private:
Listnode* rear;
};
JosephRing::JosephRing(int n)
{
Listnode* s = nullptr;
rear = new Listnode;
rear->val = 1; rear->next = rear;
for (int i = 2; i <= n; i++)
{
s = new Listnode;
s->val = i;
s->next = rear->next;
rear->next = s;
rear = s;
}
}
void JosephRing::Joseph(int m)
{
Listnode* p = rear, *q = rear->next;
int count = 1;
while (p->next != p)
{
if (count < m)
{
p = q;
q = q->next;
count++;
}
else
{
/* print(rear); */
cout << q->val << "出环" << endl;
p->next = q->next;
delete q;
q = p->next;
count = 1;
}
}
cout << p->val << "出环" << endl;
delete p;
}
/*
void JosephRing::print(Listnode* rear)
{
Listnode* p = rear->next;
while (p != rear)
{
cout << p->val << "\t";
p = p->next;
}
cout << p->val << endl;
}
*/
void main()
{
int m, n;
cout << "请输入环的长度:";
cin >> n;
cout << "请输入密码:";
cin >> m;
JosephRing r1(n);
r1.Joseph(m);
system("pause");
}
不知为啥print函数出错,改天研究一下…