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只,在把 ...
随机推荐
- 树莓派中安装QT
树莓派中安装QT 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 硬件:树莓派 步骤: 参考链接:http://qt-proje ...
- 浅析C#代理
delegate 是委托声明的基础,是.net 的委托的声明的关键字action 是基于delegate实现的代理 有多个参数(无限制个数)无返回值的代理 func 是基于delegate实现的代理 ...
- javascript (java)动态时钟
<script language="javascript"> var t = null; t = setTimeout(time,1000);//开始执行 functi ...
- MySQL如何转SQL server
MySql的数据如何导入到Sql Server数据库中?(转载) 本文咱讨论的重点是如何将MySql数据导入到Sql Server数据库中,所以就需要机器上同时安装了MySql和Sql Serve ...
- IOS 数据存储(NSKeyedArchiver 归档篇)
什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...
- Free MP3 CD Ripper_缓冲区溢出远程代码执行_CVE-2019-9766漏洞复现
Free MP3 CD Ripper_缓冲区溢出远程代码执行_CVE-2019-9766漏洞复现 一.漏洞描述 Free MP3 CD Ripper是一款音频格式转换器.Free MP3 CD Rip ...
- js 数组去重方法
var arr = ['a',1,2,3,'a',4,2,3,1,4,2,8,10,null,'a']; // 方法一 var newArr = [...new Set(arr)]; console. ...
- 【设计模式】结构型02装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由 ...
- vue-cli的服务代理
vue-cli的默认端口是8080,如果我们的请求如下 我们就可以将地址改成
- .NetCore中三种注入方式的思考
该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...