一.问题描述
约瑟夫(Joseph)问题的一种描述是:编号为 1,2,…,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始任选一个整数作为报数上限 m,从第一人开始按顺时针方向从自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他的顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
二.要求:
利用单向循环链表存储结构模拟此过程,按照出列的顺序引出个人的编号。并且不需要头结点。
三.测试数据:
n=7,7个人的密码依次是3,1,7,2,4,8,4;m=6,正确的出列顺序为6,1,4,7,2,3,5

四.运行结果如下

五.完整代码如下,详细见注释

#include"stdio.h"
#include"malloc.h"typedef struct  //自定义结构体,
{int index,password;  //index存储每个人的序号,password存储每个人的密码struct  *next;
}Node,*Linklist;  //Node定义结点,Linklist定义指针
Linklist p,first,temp; //建立全局变量,方便void Initlist(int n) //n个元素的链表
{int i,j,num;;first=(Node*)malloc(sizeof(Node));   //创建首元结点if (!first)return 0;p=first; //拷贝副本for( i=1;i<n;i++){temp=(Node*)malloc(sizeof(Node)); //新建结点if (!temp)return 0;p->next=temp; //p一开始在表头,新结点插后p=temp;  //p向前移动}p->next=first; //尾部连接表头temp=first;    //让temp做first副本for( j=1;j<=n;j++){temp->index=j;  //j是序号printf("请输入第%d个人的密码:",j);scanf("%d",&num);temp->password=num;  //存储密码temp=temp->next;}temp=p;  //这时候temp指向最后一个元素
}void find(int m,int n)
{int i,j;for(i=1;i<=n;i++)         {for(j=1;j<m;j++)      temp=temp->next; //temp指向第m-1个元素p=temp->next;    //p指向第m个元素m=p->password;  //更新m的值printf("%d,",p->index);  //输出出列人的序号temp->next=p->next;  //删掉p结点free(p);      //释放动态申请的结点空间}return 0;
}void main(){   int m,n;   //m为报数初值,n为初始人数
printf("请输入报数初值m:");
scanf("%d",&m);
printf("请输入初始人数n:");
scanf("%d",&n);
Initlist(n);  //初始化循环链表
printf("出队的人依次是:");
find(m,n);    //开始淘汰}

C语言循环链表(不带头结点)解约瑟夫问题的一种变形相关推荐

  1. c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...

    对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾 ...

  2. C语言实现不带头结点的单链表逆置的三种方法

    C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...

  3. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  4. 不带头结点的单链表c语言,数据结构:C语言实现----不带头结点单链表总结

    不带头结点的单链表结构体声明 typedef struct Node { int data; struct Node *next; }Node, *LinkList; (1)初始化 void Init ...

  5. 数据结构:C语言实现----不带头结点单链表总结

    不带头结点的单链表结构体声明 typedef struct Node {int data;struct Node *next; }Node, *LinkList; (1)初始化 void InitLi ...

  6. 数据结构_带头结点的双向循环链表

    这篇博客整理带头结点的双向循环链表.带头结点的双向循环链表在进行操作的时候是要比单链表更方便的,比如说在尾删的时候,不需要遍历整个链表,头结点的上一个结点就是尾结点.凡是涉及到寻找尾结点的操作,都会比 ...

  7. 算法与数据结构之带头结点和不带头结点单链表存在的问题

    带头结点和不带头结点单链表注意的小细节 在写不带头结点的单链表中发现了一个问题,这个问题在带头结点的单链表中也存在,那就是值传递的问题. 首先来看一下 #include<stdio.h> ...

  8. C语言实现双向非循环链表(不带头结点)的基本操作

    双向链表也叫双链表,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任何一个节点开始,都可以很方便的访问它的前驱结点和后继节点.别人常常来构造双向循环链表,今天我们特立 ...

  9. 数据结构带头结点单向不循环链表(C语言版)

    main.c,负责测试 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include<stdlib.h> #inc ...

最新文章

  1. mysql 5.5.修改库名_安全快速修改Mysql数据库名的5种方法
  2. 上传文件到 Web 服务器
  3. filenotfoundexception是什么异常_Java异常处理:给程序罩一层保险
  4. aspnetcore 实现简单的伪静态化
  5. 在线学ajax,ajax学习
  6. android 模拟长按菜单键_如何采用PLC梯形图实现单键启动程序
  7. matlab建立的发动机的模型,基于MATLAB∕Simulink的摩托车发动机仿真模型建立.pdf
  8. SOEM控制io超简洁程序
  9. Matlab实现GM(1,1)模型(源代码)
  10. Android编译环境搭建
  11. 谷歌浏览器html5视频播放器,谷歌浏览器-HTML5视频不会循环播放
  12. 为何数据库也云原生了?
  13. 爱学习的小虫子——Who Am I ?
  14. Java架构师-容器化(一):服务容器化技术-Docker、Cloud Foundry
  15. zip直链生成网站_防止赖床的闹钟软件、免费好用的看图软件、色卡生成器 今天有什么?...
  16. 关于Ctrl+PageDown在使用查找功能后不能使用的问题
  17. CCF 201712-4行车路线
  18. 计算机为什么能做翻译,为什么计算机能翻译?
  19. Spring Boot集成阿里云视频点播服务的过程记录
  20. manifest java_JAR包中的MANIFEST.MF文件详解以及编写规范

热门文章

  1. 天使与海豚的爱情故事
  2. JADE学习笔记2 :Agent的创建和运行
  3. 韩国媒体:中国手机的崛起,都是依靠“性价比”?
  4. Unhandled exception at 0x000007FEFD5C9E5D in OpenCV3.3_TestDemo.exe: Microsoft C++ exception: cv::Ex
  5. 一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=1+2+3.编程 找出1000以内的所有完数
  6. 记录科研路上的第一篇也是最后一篇论文投稿全过程:《中国图象图形学报》投稿经验帖
  7. Java二维数组详解:二维数组的声明和初始化,以及获取二维数组的值
  8. 怎么算程序框图的计算机程序,算法与程序框图导学案
  9. nacos Field ‘nid‘ doesn‘t have a default value;
  10. 【docker】学习docker