实验名称:约瑟夫环 问题描述:约瑟夫环问题的一种描述是:编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。试设计一个程序求出出列顺序。 基本要求:利用单向循环链表模拟此过程,按照出列的顺序印出各人的编号。 测试数据:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。 实现提示:程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n<=30。此题所用的循环链表中不需要头结点,注意空表和非空表的界限。
时间: 2023-05-28 22:08:04 浏览: 132
YueSeFuHuan.rar_约瑟夫环
以下是Python实现:
class Node:
def __init__(self, data):
self.data = data
self.next = None
class CircularLinkedList:
def __init__(self):
self.head = None
self.tail = None
def is_empty(self):
return self.head == None
def add_node(self, data):
new_node = Node(data)
if self.is_empty():
self.head = new_node
self.tail = new_node
new_node.next = self.head
else:
self.tail.next = new_node
self.tail = new_node
new_node.next = self.head
def delete_node(self, node):
if self.head == node:
self.head = node.next
self.tail.next = self.head
elif self.tail == node:
current = self.head
while current.next != self.tail:
current = current.next
current.next = self.head
self.tail = current
else:
current = self.head
while current.next != node:
current = current.next
current.next = node.next
def traverse(self):
current = self.head
while current.next != self.head:
print(current.data, end=' ')
current = current.next
print(current.data)
m = int(input("请输入初始报数上限值:"))
n = int(input("请输入人数n:"))
passwords = []
for i in range(n):
password = int(input("请输入第{}个人的密码:".format(i+1)))
passwords.append(password)
linked_list = CircularLinkedList()
for i in range(1, n+1):
linked_list.add_node(i)
current_node = linked_list.head
while not linked_list.is_empty():
for i in range(m-1):
current_node = current_node.next
m = current_node.data
linked_list.delete_node(current_node)
print(current_node.data, end=' ')
current_node = current_node.next
print("\n出列顺序为:", end='')
for password in passwords:
for i in range(1, n+1):
if linked_list.head.data == i and password == m:
print(i, end=' ')
m = linked_list.head.next.data
linked_list.delete_node(linked_list.head)
break
阅读全文