总共有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. [JLOI2014]松鼠的新家-树链剖分

    最开始的时候我在写线段树部分的时候还打了一个build,后来一想,打个球球大作战的build啊!!!有个锤子的用啊!!! #include<bits/stdc++.h> using nam ...

  2. 初学python之路-day12

    本篇补上字符串的比较:按照从左往右比较每一个字符,通过字符对应的ascii进行比较 一.函数默认值的细节 # 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值 a ...

  3. OpenCV-Python:模板匹配

    啥叫模板匹配 模板匹配就是在大图中找小图,也就说在一幅图像中寻找另一幅模板图像的位置: OpenCV使用 cv2.matchTemplate() 实现模板匹配. import cv2 import n ...

  4. 解决ODBC连接Oracle数据库报Unable to connect SQLState=08004问题

    今天用ODBC连接Oracle数据库时,报了这么一个错“Unable to connect SQLState=08004 Oracle ODBC Ora-12154”,上网查了好久都说PowerDes ...

  5. C#学习-扩展方法

    并不是所有的方法都可以用作扩展方法,如何分辨代码中定义的是扩展方法还是普通方法呢? 我们需要考察它是否符合下列扩展方法的定义规则: 1.扩展方法必须在一个非嵌套.非泛型的静态类中定义: 2.它至少要有 ...

  6. C#生成COM组件

    1.类库代码 1.1暴露的方法必须以接口的方式实现 1.2类需要GUID编号 using System; using System.Runtime.InteropServices; //COM组件 n ...

  7. Trie for string LeetCode

    Trie build and search class TrieNode { public: TrieNode * next[]; bool is_word; TrieNode(bool b = fa ...

  8. IntelliJ IDEA 2018.3.3配置 Tomcat 9,控制台出现中文乱码 “淇℃伅”(2019/01/25)

    (win10系统) 全新idea配置全新版本Tomcat突遇 “淇℃伅”,网上大部分解决方案均已失效 似乎是idea与Tomcat命令行输出格式不一致所致,千辛万苦在某一小角落发现这个方法,一针见血, ...

  9. jar文件内lib引用的jar插件修改后更新

    打包的java服务在第三方jar进行修改后,要更新线上的jar包时,直接替换原有lib引用的jar文件,会造成服务起不来, 可在本地clean install之后,用线上的classes文件夹替换本地 ...

  10. selenium操作浏览器窗口最大化和刷新

    实际测试过程中经常遇到打开一个页面并不是全屏显示,但是却希望它能够全屏显示或者新增一条记录后需要刷新一下看能不能再列表中正常显示. 于是就有了今天的关于对浏览器窗口的最大化和刷新页面.需要说明的一点: ...