约瑟夫环问题 --链表 C语言
总共有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语言的更多相关文章
- 约瑟夫环问题分析-C语言经典面试题
好久没有看有关算法的问题了,今天废了不少劲,再感叹一句:要想学好算法就要常练习,没什么捷径可走.废话不多说,如下: 问题描述:有m个人,围成一个环,编号为 0.1.2.3...m-1,从第一个人开始循 ...
- 第K人||约瑟夫环(链表)
http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4442 很容易超时 通过数组来记录,删除 //数组从1开始好像不行 后面一些数字就乱码了,因 ...
- 约瑟夫环(N个人围桌,C语言,数据结构)
约瑟夫环问题(C语言.数据结构版) 一.问题描述 N个人围城一桌(首位相连),约定从1报数,报到数为k的人出局,然后下一位又从1开始报,以此类推.最后留下的人获胜.(有很多类似问题,如猴子选代王等等, ...
- javascript中使用循环链表实现约瑟夫环问题
1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...
- 通过例子进阶学习C++(六)你真的能写出约瑟夫环么
本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...
- C语言链表实现约瑟夫环问题
需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
- 简单约瑟夫环的循环单链表实现(C++)
刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...
- 约瑟夫环(Joseph)的高级版(面向事件及“伪链表””)
约瑟夫环问题: 在一间房间总共有n个人(下标0-n-1),只能有最后一个人活命. 按照如下规则去杀人: 所有人围成一圈 顺时针报数,每次报到q的人将被杀掉 被杀掉的人将从房间内被移走 然后从被杀掉的下 ...
随机推荐
- python学习第32天
# 使用模块操作进程# multiprocessing 一个多元化的进程模块# multiple 多元化 processing 进程 # 涵盖了和进程相关的几乎所有的内容# Process类 帮助你启 ...
- Java面试题 静态代码块 构造代码块 构造方法 的执行顺序
JAVA中的静态代码块 构造代码块 构造方法执行顺序: 静态代码块(类加载时执行)>>构造代码块>>构造方法 下面展示一个简单的例子,推荐大家动手运行一遍: public cl ...
- Python——类与对象,异常处理
类 class C1: def setdata(self,value): self.data = value def display(self): print(self.data) class C2( ...
- 关于form-checkbox 必填项无效的错误
校验规则要写在一个form里 检查data,给个默认值. 否则刚进去错误提示不显示. 其次,要加 type 类型,注意大小写 触发类型为 change .
- 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问题:找不到SCOTT员工了,只有13条数据,这显然不合理:这就是内连接的缺 ...
- javascript--实现几个简单的操作
利用JS实现几个简单的功能 --还有省市联动,商品的左右选择,表单的校验.但在学了jQuery之后,感觉这个没那么重要了,就不写了 表格的全选和全不选 表格的动态隔行换色 <!DOCTYPE h ...
- servlet九大内置对象和监听器
对象名称 类型 描述 作用域 request javax.servlet.ServletRequest 表示一次用户请求 Request response javax.servlet.SrvletRe ...
- POJ:1833 按字典序找到下一个排列:
http://poj.org/problem?id=1833 按照字典的顺序(a-z) (1-9),可以得出任意两个数字串的大小.比如“123”, 最小的是“123”(从小到大),最大的是“321”( ...
- 一起学爬虫——如何爬取通过ajax加载数据的网站
目前很多网站都使用ajax技术动态加载数据,和常规的网站不一样,数据时动态加载的,如果我们使用常规的方法爬取网页,得到的只是一堆html代码,没有任何的数据. 请看下面的代码: url = 'http ...
- AtCoder Grand Contest 031 (AGC031) D - A Sequence of Permutations 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC031D.html 前言 比赛的时候看到这题之后在草稿纸上写下的第一个式子就是 $$f(p,q) = pq^ ...