【c语言习题】使用链表解决约瑟夫问题

news2024/11/27 19:34:55

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c语言系列专栏:c语言之路重点知识整合 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

链表有关知识点:【c语言】链表

题目:

约瑟夫问题

据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后, 39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。

首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决。

Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个第31个位置,于是逃过了这场死亡游戏。

数组方法:【c语言习题】使用数组解决约瑟夫问题


约瑟夫问题 目录

  • 题目:
  • 过程分析:
  • 淘汰过程图解
  • 完整代码:
  • 结果:

过程分析:

定义链表节点类型Node,包含两个域:data和指向下一个节点的指针next。

typedef struct node //定义链表 节点
{
	int data;
	struct node* next;
}Node;

定义函数void fun(int n, int m),参数n为总人数,m为报数出局的数字

void fun(int n, int m)  //总共有n个人,报数为m的人出局 

初始化循环链表:

创建头结点head
head->data赋值为1
head->next赋值为NULL

然后用p和q两个指针完成插入操作,让p指向headq表示新插入的节点

	//初始化循环链表
	Node* head = NULL;	//头节点
	head = malloc(sizeof(Node));  
	head->data = 1;       //起始编号
	head->next = NULL;    
	Node* p = head;

	Node* q = NULL;

尾插法创建链表并构造循环链表:

从2开始遍历创建剩下的N-1个结点,每个结点依次插入到链表的尾部,即将p->next=r; q=p;
最后将最后一个节点p的next指针指向头节点head,完成循环链表的构建

for (int i = 2; i <= n; i++)//创建链表的n-1个节点
	{
		q = malloc(sizeof(Node));
		q->data = i;
		q->next = NULL;
		
		p->next = q;//插入节点
		p = q;
	}
	
	p->next = head;   //最后一个节点的next指向头节点
	p = head;  //记录头节点      

找到需要淘汰的节点:

计数器m每次加一,同时移动p指针,当m变成选定的淘汰数字时,
保留p指针位置(即将要淘汰的同学的位置),然后将p指向下一个同学
将淘汰同学输出,并将p指向下一个同学继续报数

while (p->next != p)  //链表中只剩下最后一个节点
	{
		for (int i = 1; i < m; i++)  //报数为m出局 
		{
			q = p;   //通过临时指针保存所对应节点的前一个节点的地址,最终找到需要删除的节点p,并输出节点data
			p = p->next; 
		}
		
		printf("%d ", p->data);
		q->next = p->next;
		p = p->next;  //重置p重新报数
	}

当只有一个节点时,结束淘汰循环

printf("%d\n", p->data);
	printf("存活最后的%d位\n", m-1);
	free(q);
	free(head);
	q = NULL;
	head = NULL;

淘汰过程图解

在这里插入图片描述

完整代码:

#include <stdio.h>
typedef struct node //定义链表 节点
{
	int data;
	struct node* next;
}Node;

void fun(int n, int m)  //总共有n个人,报数字为m的人出局 
{
	//初始化循环链表
	Node* head = NULL;	//头节点
	head = malloc(sizeof(Node));  
	head->data = 1;       //起始编号
	head->next = NULL;    
	Node* p = head;

	Node* q = NULL;
	
	for (int i = 2; i <= n; i++)//创建链表的n-1个节点
	{
		q = malloc(sizeof(Node));
		q->data = i;
		q->next = NULL;
		
		p->next = q;//插入节点
		p = q;
	}
	
	p->next = head;   //最后一个节点的next指向头节点
	p = head;  //记录头节点      

	
	while (p->next != p)  //链表中只剩下最后一个节点
	{
		for (int i = 1; i < m; i++)  //报数为m出局 
		{
			q = p;   //通过临时指针保存所对应节点的前一个节点的地址,最终找到需要删除的节点p,并输出节点data
			p = p->next; 
		}
		
		printf("%d ", p->data);
		q->next = p->next;
		p = p->next;  //重置p重新报数
	}
	printf("%d\n", p->data);
	printf("存活最后的%d位\n", m-1);
	free(q);
	free(head);
	q = NULL;
	head = NULL;
}

int main()
{
	int n, m;
	printf("请输入总人数:");
	scanf_s("%d", &n);
	printf("请输入报数的数字:");
	scanf_s("%d", &m);
	fun(n, m);

	system("pause");
	return 0;
}

结果:

在这里插入图片描述


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Shell 脚本中使用 `exec` 命令的方法和用途

在 Shell 脚本中&#xff0c;exec 是一个非常有用的命令&#xff0c;用于执行命令或替换当前进程。它允许您在脚本中启动新的进程&#xff0c;并将控制权完全转移到新进程。本文将详细介绍在 Shell 脚本中使用 exec 命令的方法和用途。 什么是 Exec 命令&#xff1f; exec 是一…

python基础----02-----字面量、变量、数据类型及其转换、标识符以及字符串、数据输入(input语句)

一 字面量 1 字面量 字面量&#xff1a;在代码中&#xff0c;被写下来的的固定的值称之为字面量。类似C/C的字符串常量。 1.1 常见的python值类型 Python中常见的值类型&#xff1a; 实际上在C/C字面量和这里的类型还是有区别的&#xff0c;体现在内存存储中&#xff0c;字…

JavaScript正则表达式

1.介绍 2.语法 3.元字符 4.修饰符 目标&#xff1a;学习正则表达式概念及语法&#xff0c;编写简单的正则表达式实现字符的查找或检测。 一、介绍 1.什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。&#xff08;…

设计模式之~原型模式

定义&#xff1a;用原型实例指导创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象&#xff0c;而且不需知道任何创建的细节。 优点&#xff1a; 一般在初始化的信息不发生变化的情况下&#xff0c;克隆是最…

触摸屏驱动的问题,在C站搜文章一下午解决不了,最后ChatGpt解决了

目录 一、遇到问题二、在C站搜索文章去解决问题的收获三、用 ChatGpt 去解决的收获四、总结 一、遇到问题 现实问题&#xff1a; 有一个基于Linux4.19内核开发了&#xff0c;在海思SS528芯片运行的系统&#xff0c;用鼠标可以正常使用。 现在要求使用一块公司开发的 多点触控屏…

ES+Redis+MySQL,这个高可用架构设计

一、背景 会员系统是一种基础系统&#xff0c;跟公司所有业务线的下单主流程密切相关。如果会员系统出故障&#xff0c;会导致用户无法下单&#xff0c;影响范围是全公司所有业务线。所以&#xff0c;会员系统必须保证高性能、高可用&#xff0c;提供稳定、高效的基础服务。 …

window10安装vim编辑器

我们在做git操作的时候&#xff0c;很多文字编辑工作会默认打开 Vim 编辑器来进行操作。 Vim 是一个高度可配置的文本编辑器&#xff0c;旨在让创建和更改任何类型的文本变得非常高效。大多数 UNIX 系统和 Apple OS X 都将它作为vi包含在内&#xff0c;用惯了Linux中的Vim编辑器…

机器学习实战7-基于机器学习算法预测相亲成功率

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战7-基于机器学习算法预测相亲成功率&#xff0c;随着社会的发展&#xff0c;大家都忙于事业&#xff0c;对自己的终身大事就耽搁了&#xff0c;相亲是一种传统的寻找伴侣的方式&#xff0c;随着时代的发…

谷歌训了28个15亿参数模型,说明数据对大模型训练的影响

夕小瑶科技说 原创 作者 | Python 随着ChatGPT的爆火&#xff0c;大规模语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;如日中天。然而&#xff0c;由于相关数据细节并不公开&#xff0c;相关研究大多都是盲人摸象式探索&#xff0c;缺乏系统的经验指导…

关于打卡小程序可能会遇到的部分问题【华为云Astro低代码体验季】

关于打卡小程序可能会遇到的部分问题【华为云Astro低代码体验季】 前提一、可能遇到的问题二、 改进 前提 已经注册华为云账号且浏览过 &#xff1a;华为云Astro制作打卡小程序&#xff0c;在此基础上可能会遇到的问题 一、可能遇到的问题 当创建完成应用后&#xff0c;如果…

设计模式之~外观模式

定义&#xff1a; 为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 结构图&#xff1a; 区分中介模式&#xff1a; 门面模式对外提供一个接口 中介模式对内提供一个接口 优点&#xff1a; 松耦…

【算法题解】32. 验证二叉搜索树的递归解法

这是一道 中等难度 的题 https://leetcode.cn/problems/validate-binary-search-tree/ 题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含…

【瑞萨RA_FSP】DMAC/DTC编程实战

文章目录 一、DMAC存储器到存储器传输二、DTC外部中断触发传输 一、DMAC存储器到存储器传输 1. FSP配置 打开该工程的 FSP 配置界面。然后按如图步骤加入 DMAC。 加入 DMAC 后如下图所示。 单击上图中新添加的 r_dmac 框&#xff0c;然后在左下角的“属性”窗口配置 DMAC 模…

一分钟学一个 Linux 命令 - cd

前言 大家好&#xff0c;我是 god23bin。欢迎来到这个系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天让我们从 cd 命令开始&#xff0c;掌握在 Linux 系统中切换目录的技巧。 什么是 cd 命令&#xff1f; cd 命令来自这么一个词语&#xff0…

liftOver 不同版本基因组文件相互转化

大家好&#xff0c;我是邓飞。前一段时间有小伙伴在星球提问&#xff1a;想将不同版本的SNP数据合并&#xff0c;不想重新call snp&#xff0c;想把绵羊的V2和V4版本的数据合并&#xff0c;具体来说&#xff0c;是V2转为V4然后与V4合并。 我建议用liftOver软件进行处理&#xf…

SAP-MM-采购折扣知识与会计处理

采购折扣&#xff0c;按折扣的方式和性质可以分为商业折扣和现金折扣两种方式。 商业折扣是指购货方批量进货时&#xff0c;要求销货方按零售价格打一个折扣而少支付的货款金额。企业之间的商品购销活动中&#xff0c;商业折扣是一种较常见的交易现象。 现金折扣则是指在赊购条…

数列DP进阶

目录 一&#xff0c;斜率优化 1&#xff0c;斜率优化原理 2&#xff0c;凸包和斜率计算 3&#xff0c;实战 黑暗爆炸 - 4709 柠檬 二&#xff0c;else 力扣 644. 子数组最大平均数 II&#xff08;最大子段和二分&#xff09; ​力扣 646. 最长数对链 力扣 1235. 规划兼…

浅科普一下计算机发展史阶段及那些不为人知的重要里程碑

目录 〇、前言 一、计算机发展历史阶段 二、计算机发展史中重要的里程碑 三、计算机对人类社会发展的重要性 四、计算机的应用领域 五、常见计算机辅助技术 六、总结 〇、前言 计算机的诞生无疑对人类社会的发展起着至关重要的巨大作用。计算机发明者名叫约翰冯诺依曼&a…

SAP-MM-发票-采购运费

采购运费是采购业务中一种特殊的定价&#xff0c;在SAP系统中&#xff0c;交货成本和其相近&#xff0c;是指在货物交付过程中发生的运输成本&#xff0c;只要有货物交付&#xff0c;就会有运费&#xff0c;而运费或者由采购方承担&#xff0c;或者由销售方承担&#xff0c;国内…

03SpringCloud Docker

Docker (1&#xff09;从VM与Docker框架中&#xff0c;直观上VM多了一层Guest OS&#xff0c;同时Hypervisor会对硬件资源进行虚拟化&#xff0c;docker直接使用硬件资源&#xff0c;所以资源利用率相对docker低。 &#xff08;2&#xff09;openstack能够以10台/min的速度创建…