list.h

#ifndef _List_H
#define _List_H
typedef int ElementType; struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position; //定义一个空链表
List MakeEmpty(); //判断链表是否为空,0为空,1为非空
int IsEmpty( List L ); //int IsLast( Position P, List L ); //查找数据X在链表L中的位置,若不存在返回NULL
Position Find( ElementType X,List L ); //从链表中删除数据为X的结点
void Delete( ElementType X,List L); // 从链表中删除P结点
void Delete_two( Position P ); //查找数据X在链表L中的直接前驱结点
Position FindPrevious( ElementType X, List L ); void Insert( ElementType X, Position P );
void DeleteList( List L );
//Position Header( List L);
//Position First( List L );
//Position Advice( Position P);
//ElementType Retrieve( Position P); #endif /*_List_H*/ /*Place in the Implementation file */
struct Node
{
ElementType Element;
Position Next;
};

list.c

#include "list.h"
#include <stdlib.h> /*make a empty list,Head pointer to it's head*/
List MakeEmpty()
{
PtrToNode L;
L=(struct Node*)malloc(sizeof(struct Node));
L->Next = L;
return L;
} /*Return true if L is empty*/
int IsEmpty( List L )
{
if( L->Next == L )
return 1;
else
return 0;
} /*Return true if P is the last position in list L*/
/*int IsLast( Position P, List L )
{
return P->Next==NULL;
}*/ /*Return Position of X in L;NULL if not found*/
Position Find( ElementType X,List L )
{
Position P;
P=L->Next;
while(P != L && P->Element != X)
P=P->Next;
if( P == L )
return NULL;
else
return P;
} /*Delete first occurrence of X from a list*/
/*Assume use of a header node*/
void Delete( ElementType X, List L )
{
Position P, TmpCell; P = FindPrevious( X, L );
if( P != NULL )
{
TmpCell = P->Next;
P->Next = TmpCell->Next;
free( TmpCell );
}
} /* If X is not found, then Next field of returned */
/* Position id NULL*/
/*Assumes a header */
Position FindPrevious( ElementType X, List L )
{
Position P; P = L;
while( P->Next != L && P->Next->Element != X )
P = P->Next;
if( P->Next == L )
return NULL;
else
return P;
} void Delete_two( Position P)
{
Position preP, TmpCell; preP = FindPrevious( P->Element , P );
if( preP != NULL )
{
TmpCell = preP->Next;
preP->Next = TmpCell->Next;
free( TmpCell );
}
} /* Insert (after legal position P) */
/* Header implementtation assumed */
/* Parameter L is unused in this implementation */
void Insert( ElementType X, Position P )
{
Position TmpCell; TmpCell = ( Position )malloc( sizeof ( struct Node ) );
if( TmpCell == NULL)
{
//printf( "Out of space!!!" );
}
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
/* Correct DeleteList algorithm*/
void DeleteList( List L )
{
Position P, Tmp; P = L->Next;
L->Next = NULL;
while( P != NULL)
{
Tmp = P->Next;
free(P);
P=Tmp;
}
}

Joseph.c

#include <stdio.h>
#include "list.h" void main()
{
//定义链表L
List L;
L=MakeEmpty();
Position P;
//输入人数n和m
int n ,m = 4 , tamp;
//获取人数n
printf("请输入人的个数n:\n");
scanf("%d",&n);
if( n == 0 )
{
printf("请输入人数n\n");
return;
}
else
{
int i;
for( i = 0 ; i<n ; i++ )
{
if(i == 0 )
{
Insert( i+1 , L );
P = L->Next;
}
else
{
Insert( i+1 , P );
P = P->Next;
}
}
}
//获取m
printf("请输入m:\n");
scanf("%d",&m);
tamp = 1;
P = L->Next;
while( !IsEmpty( L ) )
{
if( tamp == m )
{
printf("%d",P->Element);
tamp = 0;
Delete( P->Element , L );
}
else
{
tamp++;
P = P->Next;
if( P == L )
P = P->Next;
} }
printf("\n");
}

Github:https://github.com/Wave-Maker/DataStructs

C 单链表 实现约瑟夫环的更多相关文章

  1. Problem E: 用链表实现约瑟夫环

    Description 你听说过约瑟夫问题吗?问题大致如下:首先n个人围成一个圈,标记为1到n号.接着,从1号开始报数(从1开始),然后2号报数,然后3号...当有人报到到m时,这个人就要踢出比赛,然 ...

  2. JavaScript--数据结构与算法之链表实现约瑟夫环

    传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第三个人时将 ...

  3. 51nod 1073 约瑟夫环

    题目链接 先说一下什么是约瑟夫环,转自:传送门 关于约瑟夫环问题,无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大( ...

  4. 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环

    本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...

  5. Java实现约瑟夫环

    什么是约瑟夫环呢? 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个 ...

  6. poj 3517 约瑟夫环

    最简单的约瑟夫环,虽然感觉永远不会考约瑟夫环,但数学正好刷到这部分,跳过去的话很难过 直接粘别人分析了 约瑟夫问题: 用数学方法解的时候需要注意应当从0开始编号,因为取余会等到0解. 实质是一个递推, ...

  7. C++ 约瑟夫环

    约瑟夫环: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周 ...

  8. 用pl/sql游标实现约瑟夫环

    什么是约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为1的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数, ...

  9. php解决约瑟夫环

    今天偶遇一道算法题 "约瑟夫环"是一个数学的应用问题:一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把 ...

随机推荐

  1. Spring Cloud微服务简介

    概述 Spring Cloud给开发者提供一套按照一定套路快速开发分布式工具.它为微服务架构中涉及**配置管理,服务治理,断路器,智能路由,微代理,控制总线,全局锁,分布式会话和集群状态等操作提供了一 ...

  2. hadoop之hbase基本操作

    hbase shell 进入hbase命令行 list 显示HBASE表 status 系统上运行的服务器的细节和系统的状态 version 返回HBase系统使用的版本 table_help 引导如 ...

  3. dubbo源码分析02:服务引用

    一.何时创建服务引用 引用官方文档的原话,如果将Dubbo托管在Spring-IOC容器下,Dubbo服务引用的时机有两个,第一个是在Spring容器调用ReferenceBean的afterProp ...

  4. springboot中加分布式redis锁

    分布式redis锁,spring-boot-starter-data-redis,RedisTemplate 公司聊天的聊天系统,近期出现多个客服并发接待同一个客户的记录,经排查,是由于代码加的同步锁 ...

  5. Hexo+NexT(零):最全Hexo+Next搭建博客教程

    快速.简洁且高效的博客框架 有位大神说,喜欢写博客的人的人,折腾博客会经历三个阶段.找到一个免费空间,搭建一个博客,很欣喜,很有成就感,此为一阶段:受限免费空间各种限制,自己买空间和域名,实现对博客的 ...

  6. mysql数据库之表关系

    外键 前戏之一对多关系 # 定义一张部门员工表id name gender dep_name dep_desc1 jason male 教学部 教书育人2 egon male 外交部 漂泊游荡3 ta ...

  7. ElasticStack学习(二):ElasticStack安装与运行

    一.ElasticSearch的安装与运行 1.由于ElasticSearch是由Java语言开发的,若要运行ElasticSearch,需要安装并配置JDK,并要设置$JAVA_HOME环境变量. ...

  8. ASP.NET Core Web API中使用Swagger

    本节导航 Swagger介绍 在ASP.NET CORE 中的使用swagger   在软件开发中,管理和测试API是一件重要而富有挑战性的工作.在我之前的文章<研发团队,请管好你的API文档& ...

  9. vim配置轻量级IDE

    安装VIM 安装YouCompleteMe的时候, 需要VIM的版本比较高, 一般一些Linux长期支持版的Vim包就比较老, 所以可能需要编译安装. 卸载之前系统中安装的版本: CentOS/Fed ...

  10. SQL 对float类型列进行排序引发的异常

    车祸现场 要求:根据学分和完成时间获取前200名学员,当学分相同时,完成时间较早的排在前面 可以明显看到,完成时间为4.1号的记录排在了3.27号前面. 事故原因 float 表示近似数值,存在精度损 ...