C语言循环链表(不带头结点)解约瑟夫问题的一种变形
一.问题描述
约瑟夫(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语言循环链表(不带头结点)解约瑟夫问题的一种变形相关推荐
- c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...
对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾 ...
- C语言实现不带头结点的单链表逆置的三种方法
C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...
- c语言实现--不带头结点的单链表操作
1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...
- 不带头结点的单链表c语言,数据结构:C语言实现----不带头结点单链表总结
不带头结点的单链表结构体声明 typedef struct Node { int data; struct Node *next; }Node, *LinkList; (1)初始化 void Init ...
- 数据结构:C语言实现----不带头结点单链表总结
不带头结点的单链表结构体声明 typedef struct Node {int data;struct Node *next; }Node, *LinkList; (1)初始化 void InitLi ...
- 数据结构_带头结点的双向循环链表
这篇博客整理带头结点的双向循环链表.带头结点的双向循环链表在进行操作的时候是要比单链表更方便的,比如说在尾删的时候,不需要遍历整个链表,头结点的上一个结点就是尾结点.凡是涉及到寻找尾结点的操作,都会比 ...
- 算法与数据结构之带头结点和不带头结点单链表存在的问题
带头结点和不带头结点单链表注意的小细节 在写不带头结点的单链表中发现了一个问题,这个问题在带头结点的单链表中也存在,那就是值传递的问题. 首先来看一下 #include<stdio.h> ...
- C语言实现双向非循环链表(不带头结点)的基本操作
双向链表也叫双链表,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任何一个节点开始,都可以很方便的访问它的前驱结点和后继节点.别人常常来构造双向循环链表,今天我们特立 ...
- 数据结构带头结点单向不循环链表(C语言版)
main.c,负责测试 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include<stdlib.h> #inc ...
最新文章
- mysql 5.5.修改库名_安全快速修改Mysql数据库名的5种方法
- 上传文件到 Web 服务器
- filenotfoundexception是什么异常_Java异常处理:给程序罩一层保险
- aspnetcore 实现简单的伪静态化
- 在线学ajax,ajax学习
- android 模拟长按菜单键_如何采用PLC梯形图实现单键启动程序
- matlab建立的发动机的模型,基于MATLAB∕Simulink的摩托车发动机仿真模型建立.pdf
- SOEM控制io超简洁程序
- Matlab实现GM(1,1)模型(源代码)
- Android编译环境搭建
- 谷歌浏览器html5视频播放器,谷歌浏览器-HTML5视频不会循环播放
- 为何数据库也云原生了?
- 爱学习的小虫子——Who Am I ?
- Java架构师-容器化(一):服务容器化技术-Docker、Cloud Foundry
- zip直链生成网站_防止赖床的闹钟软件、免费好用的看图软件、色卡生成器 今天有什么?...
- 关于Ctrl+PageDown在使用查找功能后不能使用的问题
- CCF 201712-4行车路线
- 计算机为什么能做翻译,为什么计算机能翻译?
- Spring Boot集成阿里云视频点播服务的过程记录
- manifest java_JAR包中的MANIFEST.MF文件详解以及编写规范
热门文章
- 天使与海豚的爱情故事
- JADE学习笔记2 :Agent的创建和运行
- 韩国媒体:中国手机的崛起,都是依靠“性价比”?
- Unhandled exception at 0x000007FEFD5C9E5D in OpenCV3.3_TestDemo.exe: Microsoft C++ exception: cv::Ex
- 一个数如果恰好等于它的因子之和,这个数就称为完数。例如6=1+2+3.编程 找出1000以内的所有完数
- 记录科研路上的第一篇也是最后一篇论文投稿全过程:《中国图象图形学报》投稿经验帖
- Java二维数组详解:二维数组的声明和初始化,以及获取二维数组的值
- 怎么算程序框图的计算机程序,算法与程序框图导学案
- nacos Field ‘nid‘ doesn‘t have a default value;
- 【docker】学习docker