2024.12.02

思维导图

作业

使用单向循环链表完成约瑟夫环问题

#include <myhead.h>

//定义链表节点结构体
typedef struct Node
{
	int position; 		//节点存储的位置编号
	struct Node* next; 	//指点下一个的节点
}Node,*Node_ptr;

//创建循环链表的函数
Node_ptr fun_creation(int n)
{
	Node_ptr L = NULL; 		//头节点
	Node_ptr Q = NULL; 		//当前节点
	Node_ptr W = NULL; 		//临时节点

	for(int i = 1;i<=n;i++)
	{
		W = (Node_ptr)malloc(sizeof(Node)); 	//动态分配新节点的内存
		//初始化
		W->position = i; 						//设置新节点的位置编号
		W->next = NULL; 						//新节点的下一个节点初始化为NULL
		if(L == NULL)
		{
			L = W; 								//如果头结点为空,则新节点即为头结点
			Q = W; 								//当前节点也指向新节点
		}
		else
		{
			Q->next = W; 						//将新节点链接到链表的末尾
			Q = W; 								//当前节点移动到新节点
		}
	}
	if(n>0)
	{
		Q->next = L; 						//将链表的末尾节点链接到头结点,形成循环链表
	}
	return L; 								//返回头结点
}

//解决约瑟夫环问题的函数
void fun_Josephs_ring(int n,int m)
{
	Node_ptr L = fun_creation(n); 			//创建包含n个节点的循环链表
	Node_ptr Q = L;  						//创建并初始化第一个节点
	Node_ptr W = NULL;  					//创建并初始化前一个节点

	//找到最后一个节点的前一个节点,以便能正确删除第一个节点
	while(Q->next != L)
	{
		Q = Q->next;
	}
	W = Q; 									//前一个节点

	while(n>0)
	{
		//当链表中还有节点时循环
		for(int i=0;i<m-1;++i)
		{
			//报数m次,找到要删除的节点的前一个节点
			W = Q; 			
			Q = Q->next;
		}
		//删除当前节点
		W->next = Q->next; 					//将前一个节点的下一个节点指向当前节点的下一个节点
		printf("count:%d\n",Q->position); 	//输出被删除节点的位置编号
		free(Q); 							//释放被删除节点的内存
		Q = W->next; 						//当前节点移动到下一个节点
		n--; 								//链表中节点数减1
	}
	//输出最后一个剩下的节点的位置编号
	printf("last:%d\n",L->position);
}
int main(int argc, const char *argv[])
{
	int n = 7;  							//人数
	int m = 3; 								//报数间隔
	fun_Josephs_ring(n,m); 					//调用函数解决问题
	return 0;
}

2022.12.28 2023.06.08 2023.06.08 2023.07.18 2023.07.27 2023.12.06 2023.12.13 2023.12.19 2023.12.28 2019.04.23 2023.10.15 2023.10.17 2023.10.19 2023.11.10 2023.11.03 2024.01.23 2024.03.14 2024.04.03 2024.04.29 2024.05.27 2024.06.05 2024.07.05 2024.07.25 2024.08.09 2024.08.26 2024.09.05 2024.09.06 2024.09.06 2024.09.11 2024.11.08 2024.11.08 2024.11.12 2024.11.12 2024.11.14 2024.11.14 2024.11.28 2024.12.13 2024.12.13 2024.12.13 2024.12.13 2024.12.19 2024.08.27 2024.09.03 2024.10.23 2024.10.30 2024.11.01 2024.11.06 2024.11.14 2024.11.22 2024.11.27 2024.12.05 2024.12.06 2024.12.10 2024.12.10 2024.12.12 2024.12.19 2024.12.23 2024.12.24 2024.12.24 2024.12.26 2024.12.27 2024.12.31 2025.01.10 2025.01.22 2025.02.05 2025.02.11 2025.02.14 2025.2.21 2025.02.24 2025.2.26 2025.2.26 2025.02.26 2025.02.27 2025.2.28 2025.2.28 2025.02.28 2025.02.28 2025.03.03 2025.03.04 2025.03.12 2025.03.20 2025.03.21 2025.03.25 2025.04.01 2025.04.03 2025.04.03 2025.04.03 2025.04.14 2025.04.15 2025.04.18 2025.04.18 2025.04.23 2025.04.23 2025.04.29 2025.04.30 2025.05.09 2025.05.12 2025.05.21 2025.05.23 2025.05.26 2025.05.26 2025.05.28 2025 .06 .10 2025 .06 .17 2025 .06 .20 2025 .06 .12 2025 .06 .24 2025.06.04 2025.07.08 2025.07.08 2025.07.14 2025.07.11 2025.07.16 2025.07.15 2025.07.21 2025.07.22 2025.07.23 2025.07.22 2025.07.30 2025.07.30 2025.8.15 2025.8.15 2025.8.18 2025.8.18 2025.8.20 2025.8.13 2025.7.1 2025.8.18 2025.8.27 2025.9.5 2025.9.5 2025.9.5 2025.9.12 2025.9.12 2025.9.8 2025.9.8 2025.9.3 2025.9.4 2025.10.11 2025.9.30 2025.9.30 2025.9.29 2025.9.30 2025.9.26 2025.9.26 2025.9.22 2025.9.22 2025.9.19 2025.9.17 2025.10.17 2025.10.16 请不要乱序
10-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值