总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出

#include <stdio.h>
#include <stdlib.h>

typedef struct Head * PHead;
typedef struct Node * PNode;

struct Head{
PNode Next;
int length;
};

struct Node {
int data;
PNode Next;
//PNode Prev;
};

PHead creat_clist()
{
PHead TempList ;
TempList = (PHead)malloc(sizeof(struct Head));
if(TempList == NULL)
{
printf("\nInitial failed,can't malloc the head\n");
return TempList;
}
TempList -> length = 0;
TempList -> Next = NULL;
return TempList;
}

void Insert_List(PHead CList,int val,int pos)
{
PNode TempNode;
//printf("enter insert func \n");
TempNode = (PNode)malloc(sizeof(struct Node));
TempNode -> data = val;
//printf("debug..\n");

if(NULL == TempNode)
{
printf("initial Node failed\n");
return ;
}
if(CList -> Next == NULL)//当前链表为空
{
CList -> Next = TempNode;
TempNode -> Next = TempNode;//此时最后一个节点的指针指向自己本身
CList -> length ++;//长度自加一

//TempNode -> Prev = NULL;
}
else if (1 == pos)//插入到链表头部
{
PNode tmp_node = CList -> Next;//
TempNode -> Next = tmp_node;//
while (tmp_node -> Next != CList -> Next)
{
tmp_node = tmp_node->Next;
}
tmp_node -> Next = TempNode;
//printf("delete num is :%d\n",tmp_node -> Next);
CList -> Next = TempNode;
CList -> length++;
}
else
{
PNode tmp_Node = CList -> Next;
for(int circle = 1;circle < pos - 1;circle++)
{
tmp_Node = tmp_Node -> Next;
}
TempNode -> Next = tmp_Node -> Next;
tmp_Node -> Next = TempNode;
CList -> length ++ ;
}
return ;
}

PNode pop_List(PHead CList,int pos)
{
printf("CList length is %d,pop number is : %d\n",CList -> length,pos);
if(pos <= 0)
{
printf("pos select error!\n");
exit(1);
}
if(1 == pos)
{
PNode tmp_node = CList -> Next; // 用于作为最后一个的判断和返回的参数
printf("delete num is : %d\n",(CList -> Next) -> data);
PNode Temp_Node = (CList -> Next) -> Next;//
while(Temp_Node -> Next != tmp_node)
{
//printf("skip data is :%d\n",Temp_Node -> data);
Temp_Node = Temp_Node -> Next;
}
CList -> Next = tmp_node -> Next;
Temp_Node -> Next = CList -> Next;
CList -> length -- ;
return tmp_node;
}
else if(pos == CList->length)
{
printf("pos == length\n");
PNode Temp_Node = CList->Next;
for(int circle = 0;circle < pos - 1;circle++)
{
//printf("skip data is : %d\n",Temp_Node -> data);
Temp_Node = Temp_Node -> Next;
}
printf("delete num is : %d\n",(Temp_Node -> Next) -> data);
Temp_Node -> Next = CList -> Next;
CList -> length--;
}
else
{
//printf("normal\n");
PNode Temp_Node = CList -> Next;
for(int circle = 1;circle < pos - 1; circle++)
{
Temp_Node = Temp_Node -> Next;
}
PNode tmp_node = Temp_Node -> Next;
Temp_Node -> Next = tmp_node -> Next;
printf("delete num is : %d\n",tmp_node -> data);
CList -> length --;
printf("length is : %d\n",CList -> length);
return tmp_node;
}
}

void freeClist(PHead CList)
{
PNode Temp_Node = CList -> Next;
for(int circle = 0; circle < CList -> length; circle++)
{
PNode tmp_node = Temp_Node;
Temp_Node = Temp_Node -> Next;
free(tmp_node);
}
free(CList);
printf("release successfully!\n");
return ;
}

void show_CList(PHead CList)
{
PNode temp_node = CList -> Next;
//while(temp_node -> Next != CList -> Next)
for(int circle = 0;circle < CList -> length; circle++)
{
printf("%5d",temp_node -> data);
temp_node = temp_node -> Next;
}
printf("\n");
}

int main()
{
PHead CList = creat_clist();
int num ;
int length;
printf("请输入约瑟夫环长度: \n");
scanf("%d",&length);
printf("\n请输入筛选的序号:\n");
scanf("%d",&num);
for(int circle = 0;circle < length; circle ++)
{
Insert_List(CList,circle+1,circle+1);
}
printf( "Original: \n" );
show_CList(CList);
//show_CList( );
printf("length:%d \n",CList -> length);

PNode tmp_node = CList -> Next;
while(CList -> length != 1)
{

for (int circle = 1;circle < num - 1;circle++)
{
tmp_node = tmp_node ->Next;
}
if(tmp_node -> Next == CList -> Next)
{
printf("delete data is : %d\n",(CList -> Next) -> data);
//free(tmp_node -> Next);
tmp_node -> Next = (tmp_node -> Next) -> Next;
CList -> Next = tmp_node -> Next;
CList -> length --;
}
else
{
printf("delete data is : %d \n",(tmp_node -> Next) -> data);
//free(tmp_node -> Next);
tmp_node -> Next = (tmp_node -> Next) -> Next;
CList -> length --;
}
tmp_node = tmp_node -> Next;
}
printf("Last is:\n");
show_CList(CList);
freeClist(CList);
return 0;
}

约瑟夫环问题 --链表 C语言的更多相关文章

  1. 约瑟夫环问题分析-C语言经典面试题

    好久没有看有关算法的问题了,今天废了不少劲,再感叹一句:要想学好算法就要常练习,没什么捷径可走.废话不多说,如下: 问题描述:有m个人,围成一个环,编号为 0.1.2.3...m-1,从第一个人开始循 ...

  2. 第K人||约瑟夫环(链表)

    http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4442 很容易超时 通过数组来记录,删除 //数组从1开始好像不行 后面一些数字就乱码了,因 ...

  3. 约瑟夫环(N个人围桌,C语言,数据结构)

    约瑟夫环问题(C语言.数据结构版) 一.问题描述 N个人围城一桌(首位相连),约定从1报数,报到数为k的人出局,然后下一位又从1开始报,以此类推.最后留下的人获胜.(有很多类似问题,如猴子选代王等等, ...

  4. javascript中使用循环链表实现约瑟夫环问题

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

  5. 通过例子进阶学习C++(六)你真的能写出约瑟夫环么

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

  6. C语言链表实现约瑟夫环问题

    需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...

  7. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

    尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...

  8. 简单约瑟夫环的循环单链表实现(C++)

    刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...

  9. 约瑟夫环(Joseph)的高级版(面向事件及“伪链表””)

    约瑟夫环问题: 在一间房间总共有n个人(下标0-n-1),只能有最后一个人活命. 按照如下规则去杀人: 所有人围成一圈 顺时针报数,每次报到q的人将被杀掉 被杀掉的人将从房间内被移走 然后从被杀掉的下 ...

随机推荐

  1. /usr/bin/ld: warning: libavformat.so.57, needed by /home/camera.so, not found (try using -rpath or -rpath-link)

    ffmpeg中,使用libavformt.so.57时,查找不到. 解决方案: 修改ld.so.conf文件,添加路径. sudo gedit /etc/ld.so.conf 在文件末尾添加路径 /u ...

  2. 微信小程序开发学习(一)

    一.各种JSON配置 1.小程序配置app.json 为小程序全局配置,包括所有页面路径.界面表现.网络超时时间.底部tab等,类比APP开发中manifest配置. 2.工具配置project.co ...

  3. 工具篇之GIT知识整理(一)

    目录 项目工具篇(一)GIT 说在前面 背景 与其他版本控制产品对比 Git下载地址及安装 下载地址 安装 在案例中简单使用Git命令 git clone git log git diff git c ...

  4. 高可用Redis(十):Redis原生命令搭建集群

    1.搭建Redis Cluster主要步骤 1.配置开启节点 2.meet 3.指派槽 4.主从关系分配 2.环境说明 两台虚拟机,IP地址分别为:192.168.81.100和192.168.81. ...

  5. 机器学习实战1-K均值

    本例来源于github项目:https://github.com/jakevdp/sklearn_pycon2015/blob/master/notebooks/04.2-Clustering-KMe ...

  6. java----代码打包

    打包 文件生成在out目录下 D:\IDEA代码\out\artifacts\IDEA_jar 注意打包好像只能打包src下面的代码 不在src目录下的一些文件,自己文件添加到打包好的目录下 可以选择 ...

  7. Docker 学习4 Docker容器虚拟化网络概述

    一.docker 虚拟化网络概述 1.OVS: OpenVSwitch,不仅能模拟二层网络,还能模拟三层网络,或者VLAN,VXLAN,流控 SDN软件定义网络技术等. 2.overlay netwo ...

  8. Ubuntu安装Hadoop

    系统:Ubuntu16.04 JDK:jdk-8u201 Hadoop:3.1.2 一.安装JDK https://www.cnblogs.com/tanrong/p/10641803.html 二. ...

  9. 极简科普 1:什么是 VOIP

    VoIP 的全称是 Voice over Internet Protocol.简单说,就是用过 IP 网络进行即时的语音/视频通信.注意,这里只强调了在传输过程中有使用 IP 网络,并没有说只通过 I ...

  10. linux 安装mysql5.7版本

    首先准备好mysql5.7.17的安装包,安装包放在  /data/software 目录下 进入到 /usr/local 目录下,解压mysql安装包 命令:   cd /usr/local tar ...