C语言链表实现约瑟夫环问题
需求表达:略
分析:

实现:
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int payload ;
struct node* next ;
}node ; /*Function:在约瑟夫环尾部插入一个结点。add
* param:node* tail 约瑟夫环的尾巴结点;
* return: node* tail 返回新的约瑟夫环尾巴结点
* */
node* add ( node* tail){
if(tail == NULL){ tail = (node* ) malloc(sizeof(node)) ;
tail -> next = tail ;
return tail ;
}
else{
node* new_tail = (node* ) malloc (sizeof(node));
new_tail -> next = tail -> next ;
tail -> next = new_tail ; return new_tail;
}
} /*Function:遍历约瑟夫环,traverse_joseph_circle
*param:node* tail
*return :void
*
*
* */
void traverse_joseph_circle(node* tail){
node* move = tail ;//作移动的指针
//整体思路:有点结点的情况下,进入遍历;把尾结点和头结点的关系给干掉,展成一条链,回到头结点,往下移动,在往下移动前,先游历这个结点,在判断能不能往下
游历。
while(move != NULL){
move = move -> next ;//移动回头结点
printf("%d ;", move -> payload) ;
if (move == tail) break ;
}
printf("\n");
}
/*Function:约瑟夫环问题的实现。eliminate
*param :node* tail; int step
*return: void
*
* */
void eliminate(node* tail,int step){
node* move = tail ;
node* save_previous = tail ;
int count = ;
while (NULL != tail && (move != move -> next)){
save_previous = move ;
move = move -> next ;if(++ count == step){
save_previous -> next = move -> next ;
printf("当前要删结点:%d\n",move -> payload);
if (tail == move ) tail = save_previous ;//更新约瑟夫环
free(move);
printf("当前结点:\n");
traverse_joseph_circle (tail) ;
move = save_previous ;
count = ; } }
}
int main(){
node* tail;
//构建十个结点的约瑟夫环
int i ;
for ( i = ; i < ; i ++ ){
tail = add (tail );
tail -> payload = i ;
}
traverse_joseph_circle (tail) ;
eliminate(tail,);
}
效果:
[xx@localhost joseph_circle]$ ./joseph_circle.out
; ; ; ; ; ; ; ; ; ;
当前要删结点:
当前结点:
; ; ; ; ; ; ; ; ;
当前要删结点:
当前结点:
; ; ; ; ; ; ; ;
当前要删结点:
当前结点:
; ; ; ; ; ; ;
当前要删结点:
当前结点:
; ; ; ; ; ;
当前要删结点:
当前结点:
; ; ; ; ;
当前要删结点:
当前结点:
; ; ; ;
当前要删结点:
当前结点:
; ; ;
当前要删结点:
当前结点:
; ;
当前要删结点:
当前结点:
;
C语言链表实现约瑟夫环问题的更多相关文章
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
- 单向环形链表解决约瑟夫环(Josephus)问题
一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...
- 用C链表实现约瑟夫环问题
问题:设有n个人围成一个圆圈,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人再次出列,如此反复,直到所有的人全部出列为止.对于任意给定的n.s.m,求按出列次序 ...
- 通过例子进阶学习C++(六)你真的能写出约瑟夫环么
本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...
- 约瑟夫环问题 --链表 C语言
总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...
- 约瑟夫环(N个人围桌,C语言,数据结构)
约瑟夫环问题(C语言.数据结构版) 一.问题描述 N个人围城一桌(首位相连),约定从1报数,报到数为k的人出局,然后下一位又从1开始报,以此类推.最后留下的人获胜.(有很多类似问题,如猴子选代王等等, ...
- 简单约瑟夫环的循环单链表实现(C++)
刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...
- 【数据结构】约瑟夫问题 C语言链表实现
1.首先,我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投 ...
- 约瑟夫环(Joseph)的高级版(面向事件及“伪链表””)
约瑟夫环问题: 在一间房间总共有n个人(下标0-n-1),只能有最后一个人活命. 按照如下规则去杀人: 所有人围成一圈 顺时针报数,每次报到q的人将被杀掉 被杀掉的人将从房间内被移走 然后从被杀掉的下 ...
随机推荐
- canvas学习(一)
Canvas 学习之路 (一) canvas 是H5 里面神一样的东西,使得只是通过html和js就能做出非常棒的游戏和画面. 因为对前端无限的爱好,更加对canvas充满好奇,将我学习canvas的 ...
- 对于Fragment的一些理解
前言 Fragment想必大家不陌生吧,在日常开发中,对于Fragment的使用也很频繁,现在主流的APP中,基本的架构也都是一个主页,然后每个Tab项用Fragment做布局,不同选项做切换,使用起 ...
- 4-MSP430定时器_定时器中断
一开始没写好就上传了,,,,,,,,这次来个全的 自己学MSP430是为了写一篇关于PID的文章,需要430在proteus上做仿真,一则认为在自动控制算法上PID真的很经典,PLC设备上大多是模块式 ...
- 【Python实战】Pandas:让你像写SQL一样做数据分析(一)
1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...
- How PhoneGap & Titanium Works
转载自 http://www.appcelerator.com/blog/2012/05/comparing-titanium-and-phonegap/ How PhoneGap Works As ...
- 文件权限及chmod使用方法
文件权限 在linux在,由于安全控制需要,对于不同的文件有不现的权限,限制不同用户的操作权限,总共有rwxXst这一些权限,我们经常使用到的是rwx,对于文件和文件夹而言,他们代表着不同的含义 对于 ...
- 图片全部加载完成之后再显示页面ui,公司项目里用上,自己写的几行代码
说明: -----onload事件 这里我并没有考虑ie的兼容性 因为项目是移动端的: -----求大神指正~ -----自己测试正常 页面没加载完之前会有一个提示 /************** ...
- LINQ to SQL语句(13)之开放式并发控制和事务
Simultaneous Changes开放式并发控制 下表介绍 LINQ to SQL 文档中涉及开放式并发的术语: 术语 说明 并发 两个或更多用户同时尝试更新同一数据库行的情形. 并发冲突 两个 ...
- 【Win10开发】Toast通知——后台激活
前篇文章我们写了关于Toast的前台激活,那么接下来就讲一讲它的后台激活.当通知出现时并不会出现app的界面,但是app能在后台获取到通知中的信息. 关于xaml和Toast通知架构我们在这里就不再赘 ...
- sqlHelper做增删改查
1.把数据库里面的数据显示出来 sqlHelper怎么用:[网上可以下载,需要可以找楼主要] 1.拷贝到项目,修改它的命名空间等于当前项目名称 2.数据库的连接信息,用户名,密码,登录方式等 < ...