约瑟夫环问题 --链表 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的人将被杀掉 被杀掉的人将从房间内被移走 然后从被杀掉的下 ...
随机推荐
- NOIP2018Day1T1 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- 使用 Xtrabackup 部署 MySQL 从库
数据库备份和恢复是数据库管理工作中非常重要的一个部分. 笔者常用的两个备份工具是mysqldump (逻辑备份)和 Xtrabackup (物理备份). 对于前者一般是用在凌晨的业务低峰期的定时任务中 ...
- 依赖背包——cf855C好题
比较裸的依赖背包,但是想状态还是想了好久 转移时由于边界问题,虽然可以倒序转移,但当容量为0|1的时候,由于有初始值的存在 很难再原dp数组上进行修改,所以额外用tmp数组来保存修改后的值 #incl ...
- 华为指标OceanStore
https://support.huawei.com/enterprise/zh/doc/EDOC1000086637?idPath=7919749%7C7941815%7C21430818%7C21 ...
- nginx 平滑更新
1.更新nginx源 #centos6的nginx源 #centos7的话吧url 的6改为7就行了 vim /etc/yum.repos.d/nginx.repo [nginx] name=ngin ...
- Github 上怎样把新 commits 使用在自己的 fork 上
作者:黄晓佳 链接:https://www.zhihu.com/question/20393785/answer/105370502 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- VIM系统复制粘贴
1 需求 系统复制粘贴主要是满足下面两个需求. 在多个对象之间复制粘贴 vim窗口与vim窗口之间 外部界面与vim窗口之间 不变复制粘贴.从外部界面复制粘贴到vim窗口时,文本不发生任何变化. 2 ...
- SQLSERVER的递归
实际项目如遇到按照如地区这样树状结构的条件递归查询数据的场景中,可以使用. CREATE FUNCTION [dbo].[GetAllChildrenTypeById] ( ) ) RETURNS T ...
- python连接mysql数据库读取数据
#-*- coding:utf-8 -*- #Author:'Lmc' #DATE: 2019/4/28/0028 上午 11:22:47 #FileName:test.PY import pymys ...
- Mysql之SQL经验基础积累
1.根据create_time排序,如何确保null值的排在最前面: 解决办法: ,), a.create_time DESC 结果如下图: