约瑟夫环数据结构c语言程序,约瑟夫环问题详解(C语言链表实现)
约瑟夫环问题,是一个经典的循环
出列顺序依次为:
编号为 3 的人开始数 1,然后 4 数 2,所以 4 先出列;
4 出列后,从 5 开始数 1,1 数 2,所以 1 出列;
1 出列后,从 2 开始数 1,3 数 2,所以 3 出列;
3 出列后,从 5 开始数 1,2 数 2,所以 2 出列;
最后只剩下 5 自己,所以 5 出列。
完整代码:
#include
#include
typedef struct node{
int number;
struct node * next;
}person;
person * initLink(int n){
person * head=(person*)malloc(sizeof(person));
head->number=1;
head->next=NULL;
person * cyclic=head;
for (int i=2; i<=n; i++) {
person * body=(person*)malloc(sizeof(person));
body->number=i;
body->next=NULL;
cyclic->next=body;
cyclic=cyclic->next;
}
cyclic->next=head;//首尾相连
return head;
}
void findAndKillK(person * head,int k,int m){
person * tail=head;
//找到链表第一个结点的上一个结点,为删除操作做准备
while (tail->next!=head) {
tail=tail->next;
}
person * p=head;
//找到编号为k的人
while (p->number!=k) {
tail=p;
p=p->next;
}
//从编号为k的人开始,只有符合p->next==p时,说明链表中除了p结点,所有编号都出列了,
while (p->next!=p) {
//找到从p报数1开始,报m的人,并且还要知道数m-1de人的位置tail,方便做删除操作。
for (int i=1; i
tail=p;
p=p->next;
}
tail->next=p->next;//从链表上将p结点摘下来
printf("出列人的编号为:%d\n",p->number);
free(p);
p=tail->next;//继续使用p指针指向出列编号的下一个编号,游戏继续
}
printf("出列人的编号为:%d\n",p->number);
free(p);
}
int main() {
printf("输入圆桌上的人数n:");
int n;
scanf("%d",&n);
person * head=initLink(n);
printf("从第k人开始报数(k>1且k
int k;
scanf("%d",&k);
printf("数到m的人出列:");
int m;
scanf("%d",&m);
findAndKillK(head, k, m);
return 0;
}
输出结果:
输入圆桌上的人数n:5
从第k人开始报数(k>1且k<5):3
数到m的人出列:2
出列人的编号为:4
出列人的编号为:1
出列人的编号为:3
出列人的编号为:2
出列人的编号为:5
约瑟夫环数据结构c语言程序,约瑟夫环问题详解(C语言链表实现)相关推荐
- c语言程序设计中北答案详解,C语言程序设计试题及答案解析汇编.doc
C语言程序设计试题及答案解析汇编 C语言程序设计试题 第1.2.3章 概述.类型.表达式 一.选择题 一个C程序由若干个C函数组成,各个函数在文件中的位置顺序为:( ) 任意 第一个函数必须是主函数, ...
- C语言程序的编译+链接详解
文章目录 前言 一.引子 二.翻译环境 三.运行环境 总结 前言 同学们在写代码的时候,我们往往要先创建一个源文件比如test.c.写完具体代码并运行后,我们的文件夹中会生成一个test.exe的文件 ...
- c语言中的字符串数组,详解C语言中的字符串数组
在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include #incl ...
- c语言遍历 json字符串,全面详解c语言使用cJSON解析JSON字符
为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件! 如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更 ...
- c语言二级指针内存释放,详解C语言-二级指针三种内存模型
二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...
- c语言随机产生10题,详解C语言的随机数生成及其相关题目
产生随机数的基本方法 本文中,笔者将介绍c语言所提供的随机数发生器的用法.现在的c编译程序都提供了一个基于一种ANSI标准的伪随机数发生器函数,用来生成随机数.Microsoft和Borland都是通 ...
- php函数find的用法,c语言find函数的用法详解
c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...
- c语言将AOE网络的数据写入TXT文档中,数据结构与算法学习辅导及习题详解.张乃孝版-C/C++文档类资源...
数据结构与算法学习辅导及习题详解.张乃孝版.04年10月 经过几年的努力,我深深体会到,编写这种辅导书要比编写一本湝通教材困难得多. 但愿我的上述理想,在本书中能够得以体现. 本书的组织 本书继承了& ...
- c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解
<数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...
- DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc
单片机中使用DSB温度传感器C语言程序 单片机中使用DS18B20温度传感器C语言程序(参考1) /************************************************** ...
最新文章
- 使用 CodeIgniter 框架快速开发 PHP 应用(二)
- xheditor的使用方法
- 手机浏览器推荐_推荐一款手机上最好用的浏览器
- 我最印象深刻的编程错误经历
- 加快网站访问速度--jquery.js
- 《金色梦乡》金句摘抄(十一)
- 求10以内平均数的c语言,求助 给小学生出题,自己选加减乘除 做10题 10以内的数 然后统计分...
- php redis 删除key 通配符,php中redis批量删除key的方法是什么
- Springboot01创建第一个程序
- selenium 三种断言以及异常类型
- linux url%7b怎么转化成,shell下解码url
- Ubuntu14.04如何启用界面root账户登录
- R语言 echarts4r 不显示图形_【课程预告】清华定量俱乐部lt;R专场gt;第三讲——R可视化基础...
- 三菱plc编程电缆通讯端口设置方法(转载)
- html+css+JavaScript(菜鸟教程版本)学习笔记7.25
- oracle 实现自增序列
- clickhouse - 第三章:内置对象 之 第二节:table表操作 - 创建表与删除表
- [Bucket CTF 2023]
- 一个200左右的数字 四个四个的数多一 六个六个的数少一 七个七个的数多六 问此数为多少。。。
- Scratch 与C语言实现数据结构静态链表的建立及操作
热门文章
- 5G C-V2X战役一触即发,广和通率先“上车”零碳商用快班车
- 峰面积峰高半峰宽_峰高峰面积的计算方法
- OpenSSL密码库算法笔记——第1.2章 乘法和平方
- 聊天话术一键快捷回复,再也不用复制粘贴了!
- android wear恢复出厂,不恢复出厂,用你的新手机连接你的 Wear OS 手表
- Allow CORS: Access-Control-Allow-Origin插件使用
- 2021-10-22 中值定理的应用
- c++ opencv mat_海思平台OpenCV编译与进一步裁剪
- 酒店管理软件测试用例,酒店管理系统-测试用例.pdf
- 丹麦或将使用区块链为贫困地区提供援助