C 单链表 实现约瑟夫环
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 单链表 实现约瑟夫环的更多相关文章
- Problem E: 用链表实现约瑟夫环
Description 你听说过约瑟夫问题吗?问题大致如下:首先n个人围成一个圈,标记为1到n号.接着,从1号开始报数(从1开始),然后2号报数,然后3号...当有人报到到m时,这个人就要踢出比赛,然 ...
- JavaScript--数据结构与算法之链表实现约瑟夫环
传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第三个人时将 ...
- 51nod 1073 约瑟夫环
题目链接 先说一下什么是约瑟夫环,转自:传送门 关于约瑟夫环问题,无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大( ...
- 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环
本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...
- Java实现约瑟夫环
什么是约瑟夫环呢? 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个 ...
- poj 3517 约瑟夫环
最简单的约瑟夫环,虽然感觉永远不会考约瑟夫环,但数学正好刷到这部分,跳过去的话很难过 直接粘别人分析了 约瑟夫问题: 用数学方法解的时候需要注意应当从0开始编号,因为取余会等到0解. 实质是一个递推, ...
- C++ 约瑟夫环
约瑟夫环: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周 ...
- 用pl/sql游标实现约瑟夫环
什么是约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为1的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数, ...
- php解决约瑟夫环
今天偶遇一道算法题 "约瑟夫环"是一个数学的应用问题:一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把 ...
随机推荐
- c# 可移动可改变大小的控件
因为业务需要,百度了个可移动可改变大小的控件,然后自己修改了下,功能类似vs的设计面板中的功能差不多,可拖拽,改变大小 拖动的 public class MoveControl { #region 自 ...
- Windows服务器下的IIS和Apache性能比较
目前最流行的建立网站的服务工具就要属Apache与IIS了.那么他们之间到底哪个性能更好呢?到底哪个工具才是最适合我们的呢?最近我也对这方面的问题进行了一番研究. 如果是基于Linux平台的话,那不必 ...
- js&jq遇到的问题(不断更新中)
1.普通事件和事件绑定: 代码: 普通事件: var btn=document.getElementById('btn'); btn.onclick=function(){ alert("c ...
- Spark之json数据处理
-- 默认情况下,SparkContext对象在spark-shell启动时用namesc初始化.使用以下命令创建SQLContext. val sqlcontext = new org.apache ...
- 用arduino制作具有无限数据传输功能的气象站
本项目是用arduino开源硬件,来快速制作具有无限数据传输功能的气象站,我之前做过一个带数据记录功能的气象站项目,这次算是升级和改进的版本. 第1步:构想 首先,需要增加从气象站到室内接收器的无线数 ...
- PATB 1041 考试座位号(15)
#include <cstdio> #include <iostream> using namespace std; struct student{ char str[15]; ...
- VirtualBox基础使用
VirtualBox基础使用 VirtualBox相对VMware来说是轻量级的虚拟软件, 最关键的是VirtualBox是开源免费的. 配置全局选项 点击管理-->全局设定, 进入设置界面. ...
- J-link使用SWD下载的连线方式
手头有两块开发板,一个是F103ZET6,另一个是C8T6.后者开发板没有JTAG口,所以只能用SWD下载和调试程序. 有如下总结: 1.有些开发板对boot的电平有要求,网上说boot0要接高电平. ...
- 小白开学Asp.Net Core 《五》
小白开学Asp.Net Core<五> —— 使用.Net Core MVC Filter 一.简介 今天在项目(https:/ ...
- Spring Boot 打包成的可执行 jar ,为什么不能被其他项目依赖?
前两天被人问到这样一个问题: "松哥,为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误?" 大伙有这样的疑问,就是因为还没搞清楚 ...