1.约瑟夫环问题

编号为1,2…n的人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。开始任选一个整数作为报数上限m,从第一个人顺时针自1开始顺时针报数,报到m时停止报数。报到m的人出列,将他的密码作为新的m值,从他顺时针方向上的下一个人开始重新从1报下去,如此下去,直到所有的人全部出列为止。

例如,m的初值为20;n=7,7个人的密码依次是3,1,7,2,4,8,4。求出列的顺序。

2.问题分析

1.要实现报数,必须有一个数来计数,判断是否到m。

2.出列,用单链表实现即将此节点从单链表中删除。所以,必须有两个指针,一个指向当前节点,一个指向当前节点的上一个节点。删除操作主要用这两个节点来完成。

模拟图如下,第一个数字为序号,第二个数字为密码

3.C语言实现

C语言实现,采用不带头结点的循环单链表实现,因此我们需要一个头指针来指明链表的开始,又因为要循环,所以需要一个尾指针来指明链表的尾。

1.以下为初始化循环单链表的过程。此处注意返回值为结构体类型的指针,返回链表的头指针H

typedef struct node

{

int serial;

int code;

node *next;

}Josephring,*JS;

JS init_ring()

{

int n,i;

JS Temp;

JS rear,H;

printf("请输入n的取值:");

scanf("%d",&n);

rear = H = NULL;

for (i=1;i<=n;i++)

{

printf("请输入第%d个人的密码值:",i);

Temp = (JS)malloc(max * sizeof(JS));

Temp->serial = i;

scanf("%d",&Temp->code);

if (H == NULL)

{

H = Temp ;

}

else

{

rear->next = Temp;

}

rear = Temp; //表尾指针指向新的节点;

}

rear->next = H ;

return H;

}

2.接下来实现出列过程

void circle()

{

JS q = NULL;

JS p = init_ring();

int m,i;

i=1;

printf("请输入开始循环的m值m=");

scanf("%d",&m);

while (p->next!=p)

{

q = p;

p = p ->next;

i++;

if (i==m)

{

printf("序号为%d的人出列\n",p->serial);

m = p->code ;//他的密码作为新的m值;

printf("m=%d\n",m);

q ->next = p->next;

free(p);

p = q ->next;

i=1;

}

}

printf("序号为%d的人出列\n",p->serial);

free(p);

}

JS p = init_ring();意思是p指针指向头结点。

此处举例一次出列的过程:

m=20;

执行到i++时,p,q指针情况如下:

再执行

q ->next = p->next;

free(p);

p = q ->next;

free(p)在链表中表示就是2(用红色标出)那条线断开,当然在计算机中是内存释放。

然后继续循环。

运行结果截图给出:

约瑟夫环运行结果截图 c语言,C语言单链表实现约瑟夫环相关推荐

  1. 约瑟夫环数据结构c语言程序,数据结构的C语言(类C语言)--单向循环链表--约瑟夫环...

    代码区 约瑟夫环:用类C语言实现!!!可以成功运行!!!不是仅仅的算法,而是实实在在的类C #include #include typedef int ElemType; typedef struct ...

  2. c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言

    建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...

  3. # R语言——约瑟夫环

    约瑟夫环: n个人围成一个圈,从第一个人点名,每数到第三个人,这个人移出圈外, 依次类推,求最后留下来的人编号是? 思路:每次循环重新编码序号作为names,并根据names 进行筛选 拓展:约瑟夫环 ...

  4. 约瑟夫环c语言代码 指针,约瑟夫环C语言实现源代码(1)

    前天笔试有个约瑟夫环的问题,怪不得人家没通知我面试,原来我的约瑟夫环做的确实有问题,昨天晚上又重新做了下,下面上源代码: /* file:osephu.cpp author:www.5dkx.com ...

  5. c语言单链表_C语言笔试题—单链表逆序

    前情回顾 之前更多的是给大家推荐的是好用的软件,经过反思之后觉得这些东西并不是我想要的,所以从今天开始我要转变方向了,更多的往我的专业方向去发展(虽然我是个小白),当然如果有说的不对的地方,希望大家能 ...

  6. c语言实现可变单链表,c语言实现单链表

    c语言实现单链表 c语言实现单链表 定义 创建 销毁 清空 打印 获取长度 查询 删除第pos个结点 在第pos插入结点 定义 首先来看一看单链表的定义(看看百度的) 单链表是一种链式存取的数据结构, ...

  7. 约瑟夫环c语言代码顺序存储,顺序表实现约瑟夫环地问题,C语言.doc

    顺序表实现约瑟夫环地问题,C语言 计算机科学与工程学院 PAGE PAGE 2 <算法与数据结构>试验报告 计算机科学与工程学院 <算法与数据结构>试验报告[一] 专业班级 1 ...

  8. 约瑟夫环c语言计蒜客链表,约瑟夫环的故事 - osc_3n35hvex的个人空间 - OSCHINA - 中文开源技术交流社区...

    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading. ...

  9. 约瑟夫环c语言单链表的解题思路,太透彻了:约瑟夫环的三种解法

    [CSDN 编者按]极大概率出现在面试中的约瑟夫环问题来啦,本文三种方法描述解题思路,这样讲解绝对让面试官眼前一亮. 作者 | bigsai 责编 | 欧阳姝黎 前言 约瑟夫环问题是算法中相当经典的一 ...

最新文章

  1. 战略设计,必须首先把握产业的脉搏
  2. 第六章 ORacle权限设置、schema、通过profile 限制用户恶意登录、通过profile限制使用期限
  3. CodeForces 811B Vladik and Complicated Book
  4. 图标圆角角度_UI设计中图标的规范及原则【附全套视频】
  5. 【Flink】Flink UpsertStreamTableSink requires that has a full primary keys if update
  6. delphi 到出execl2010 文件损坏_如何修复Linux中损坏的软件包?
  7. drawforeground只有鼠标事件进入才刷新_罗技各系鼠标测评(2020年12月更新)
  8. ESP8266的AP模式与STA模式简单测试
  9. 剑指offer(C++)-JZ6:从尾到头打印链表(数据结构-链表)
  10. gridview checkbox从服务器端和客户端两个方面实现全选和反选
  11. 运维网发布的nagioscacti配置文档
  12. 评委打分表模板_杭州爸爸自制《奖惩表》火遍网络:请好好爱那个写作业的小孩...
  13. java利用iText.jar实现jpg转pdf
  14. STM32电机库(ST-MC-Workbench)学习记录——无感FOC代码生成
  15. 深入分析HDFS原理及读写流程
  16. android三分钟快速集成手势密码功能
  17. 传说中的世界500强面试题-推理能力(1)
  18. 微信群总是有人发广告?我用Python写个机器人消灭他!
  19. go:embed 的使用
  20. feign api Ambiguous mapping

热门文章

  1. 1.2 消息队列(4-6)
  2. 多语言笔记系列:开篇 Polyglot Notebooks 概要与使用
  3. 【STL】C++标准模板库——stack(堆栈)
  4. NOPULL,PULLUP,PULLDOWN三种模式的理解
  5. Layui框架下:JS中根据后台查询到的数据动态往div中ul里面动态添加li
  6. GPIO模拟红外发射
  7. 2020ICPC济南站 A题 Matrix Equation高斯消元求异或方程组
  8. Postgresql如何授权未来会创建的表(避免反复授权)
  9. 菜鸟的初行动——学校某代码评测服务器攻略战
  10. 静电放电试验、防护及整改措施