(二)C++单链表约瑟夫问题的实现

本文介绍了一个经典的约瑟夫环问题,并使用单循环链表进行编程解决。问题设定n个人围成一圈,从1号开始报数,报到k的人出圈,直至决出最后的胜利者。通过C++代码展示了如何创建链表、执行游戏规则及输出获胜者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)

输入

第一行为人数n;
第二行为报数k。

输出

输出最后胜利者的标号数。

样例输入

10 
4


样例输出

5

设计的单链表如图

// 8约瑟夫问题的实现.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class List {
	public:
		List();
		List(int data);
		~List();
		void Create_List(int len);
		void Play(int k);
		void Output();
	private:
		int data;
		List *Next;
};
List::List() {

}
List::List(int data) {
	this->data = data;
	this->Next = NULL;
}
void List::Create_List(int len) {
	List *L, *Node;
	int data;
	int i = 0;
	L = this;
	L->data = len;
	for (i = 0; i < len; i++) {
		Node = new List(i+1);
		L->Next = Node;
		L = L->Next;
	}
	L->Next = this->Next;
}
void List::Play(int k) {
	int i = 1;
	List *Head = this;
	List *L, *Node,*Temp;
	L = Head;
	Node = L;
	while (Head->data!=1) {
		L = Node;
		Node = Node->Next;
		if (i%k==0) {
			if (Head->Next==Node) {
				Head->Next = Node->Next;
			}
			Temp = Node->Next;
			L->Next = Temp;
			Node->Next = NULL;
			delete Node;
			Node = L;
			Head->data--;
		}
		i++;
	}
	Head->Next->Next = NULL;
}
void List::Output() {
	cout << this->Next->data;
}
List::~List() {
	if (this->Next) {
		delete this->Next;
	}
}
int main()
{
	List *Head=new List;
	int len,c;
	cin >> len;
	Head->Create_List(len);
	cin >> c;
	Head->Play(c);
	Head->Output();
	delete Head;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值