2021-4-27 日记 C++(十四)

不写抽卡小游戏了,因为我能力就到这儿了…
记录下我造轮子好了…

约瑟夫环实现:
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函数出错,改天研究一下…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值