惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Webroot Blog
Webroot Blog
AI
AI
P
Palo Alto Networks Blog
Attack and Defense Labs
Attack and Defense Labs
WordPress大学
WordPress大学
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
Spread Privacy
Spread Privacy
T
Tor Project blog
罗磊的独立博客
小众软件
小众软件
S
Security Affairs
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
Apple Machine Learning Research
Apple Machine Learning Research
T
Threatpost
NISL@THU
NISL@THU
博客园_首页
PCI Perspectives
PCI Perspectives
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Forbes - Security
Forbes - Security
博客园 - 叶小钗
D
Darknet – Hacking Tools, Hacker News & Cyber Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
L
LINUX DO - 热门话题
T
Threat Research - Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
Security Latest
Security Latest
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Cloudflare Blog
A
About on SuperTechFans
爱范儿
爱范儿
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
TaoSecurity Blog
TaoSecurity Blog
宝玉的分享
宝玉的分享
G
GRAHAM CLULEY
雷峰网
雷峰网
F
Full Disclosure
I
Intezer
Cloudbric
Cloudbric
博客园 - 三生石上(FineUI控件)
U
Unit 42

文章列表 - 她和她的猫

使用小鹤双拼一个月 折腾 Hugo PaperMod 主题 去长鹿旅游休博园 1Password 自动化登录堡垒机 深入 Hyperf:Inject 注解是如何工作的? 译|理解容器镜像层 使用 Rust 实现高性能预写日志(Write Ahead Log) 译|使用 Linux 命名空间隔离系统 深入 Hyperf:HTTP 服务是如何处理请求的? Linux 文件权限学习笔记 译|了解 Bitcask:基于日志结构的 KV 存储引擎 还原 SM2 压缩公钥的几种方法 深入 Hyperf:HTTP 服务启动时发生了什么? 一次 Hyperf 注解失效问题分析 将博客迁移到又拍云 译|PHP 7 新的 Hashtable 实现 排查 ES 查询问题:深入了解 json_encode() 函数 浅析 Redlock 分布式锁实现原理 Yar 源码阅读笔记:RPC 服务端 Yar 源码阅读笔记:客户端的并行调用 Yar 源码阅读笔记:客户端的同步调用 Yar 源码阅读笔记:数据传输模块 Yar 源码阅读笔记:消息编码模块 Yar 源码阅读笔记:RPC 通信协议 Yar 源码阅读笔记:开篇 PHP 8 新特性介绍 基于 OpenSSL 实现国密 SM4 加解密 PHP 源码阅读笔记:编译与调试 PHP 什么是惊群问题 大端模式和小端模式 基于 GitHub Actions 定时推送网址到百度站长平台 聊聊五种 I/O 模型 Workerman 源码分析:文件上传 浅入浅出 HTTP 协议 PHP 网络编程:构建 MySQL 蜜罐获取攻击者微信 ID 使用 Workerman 接入 Bilibili 直播弹幕协议 使用 GitHub Actions 自动部署 Hexo 什么是二进制安全 【转载】PHP 程序员进阶之路 优化 Workerman 检查主进程是否存活的逻辑 基于 Redis 实现分布式锁 《PHP 实现 Base64 编码/解码》笔记 PHP 多进程下载必应壁纸 基于 Redis 实现延迟队列 【转载】PHP 实现 Base64 编码/解码 使用 MySQL FIELD() 函数自定义排序规则 Laravel 的 Facades 实现原理 数据结构学习笔记:顺序栈和链栈(C语言) 使用 QueryList + Redis 下载壁纸 在 Laravel 登录/注册中使用 mews/captcha 扩展包 使用 mews/captcha 扩展包为 Laravel 应用添加图片验证码 给 YOURLS 短网址系统编写插件《批量生成短网址》 给 YOURLS 短网址系统编写插件《Hello World!》 PHP 7.1 使用 json_encode 函数造成浮点类型数据出现精度问题 Laravel 授权策略(Policy)的基本使用 Ubuntu 系统下 WiFi 频繁掉线解决方法 Laravel 应用部署到 Nginx 服务器上的第一个坑 Ubuntu 16.04 LST 安装 Redis 和 Composer PHP 采集逐浪小说章节列表 Nginx 环境 SSL 强制 HTTP 301 跳转到 HTTPS 【工作&生活】第一周 ServiceStack.Redis 与多线程 Count the number of Duplicates C# Base64 加密及解密 ASP.NET MVC 使用动态类型传递数据 Django 使用 order_by() 对数据进行排序操作 ASP.NET + jQuery + AJAX 实现用户登录 ASP.NET 从客户端中检测到有潜在危险的 Request.Form 值 ASP.NET 使用 FormData 实现 AJAX 上传图片 Python 使用 BeautifulSoup 抓取网页 贪心算法之字符串的完美度 一言不和就造轮子之 CookieHelper ASP.NET 上传图片 DBHelper 类 C# 捕获屏幕源码 用 JavaScript 做一些有趣的事情 第一篇文章 好久不见。 如何防止非法调用 PHP 文件 清明小记。 PHP 生成随机字符串 Z-Blog PHP 程序做 301 跳转 PHP 处理数组常用的几个函数 Sublime Text 3 快捷键总结 PHP 使用 file_get_contents() 函数实现采集网页 使用 C# 编写学生信息管理系统 终于到了。 zblog报错: magic_quotes_gpc 和 safe_mode 世事无常。 如何使用 PHP 上传文件 安卓手机编写和运行 PHP 程序的软件 使用 AJAX 刷新、验证 PHP 图片验证码 PHP 生成图片验证码 PHP 之 session 的使用方法 PHP 之 cookie 的使用方法 PHP 实现分页原理详解 Thinkphp 框架中系统常量在 Js 文件中不解析的解决方法
C语言单链表实现约瑟夫环
她和她的猫 · 2018-12-31 · via 文章列表 - 她和她的猫

前言

前两天朋友给我发来一个题目,问我能不能用C语言链表实现。

13个人围成一圈,从第1个人开始顺序报号1,2,3。凡报到“3”者退出圈子,找出最后留在圈子中的人原来的序号。要求用链表实现。

看了题目以后发现其实是 约瑟夫环,是一个数学应用问题。

约瑟夫环

约瑟夫环 又称为 约瑟夫问题丢手绢问题

一群人围在一起坐成环状,从某个编号开始报数,数到某个数的时候,此人出列,下一个人重新报数,一直循环,直到所有人出列,约瑟夫环结束。

例如有序号分别为 1、2、3 的人围成一个圈, 从 1 开始报数,数到 3 的淘汰。

第一轮,淘汰:3,剩余 1、2、

第二轮,淘汰:1,剩余 2

2 号就是最后留在圈子中的人。

代码实现

代码中用了链式队列的思想来模拟报数,头部取出,尾部插入。

#include <stdio.h>
#include <malloc.h>

/**
 * 结构体
 */
struct PerNode {
    // 序号
    int m_iNumber;
    // 下一个元素的指针
    struct PerNode * m_pNextPer;
};

/*
**函数功能:采用malloc函数动态地创建并初始化一个单向链表
**入口参数:iLstLen为拟创建链表的结点数
**返回值:新创建链表的头结点的指针
*/
struct PerNode * crtPrLst(int iLstLen) {
    // 生成头节点
    struct PerNode *headNode = malloc(sizeof(struct PerNode));

    struct PerNode * perNode = headNode;
    perNode->m_pNextPer = NULL;

    // 用于存放临时生成的元素
    struct PerNode *temp;

    // 创建链表
    for (int i = iLstLen; i >= 1 ; i--) {
        temp = malloc(sizeof(struct PerNode));
        temp->m_iNumber = i;
        temp->m_pNextPer = perNode->m_pNextPer;
        perNode->m_pNextPer = temp;
    }

    return headNode;
}

/**
 * 删除并返回链表的第一个元素
 * @param pTmp
 * @return
 */
struct PerNode * pop(struct PerNode * pTmp) {
    if (pTmp == NULL) {
        return NULL;
    }

    // 取出第一个元素
    struct PerNode * temp = pTmp->m_pNextPer;

    if (temp == NULL) {
        return NULL;
    }

    // 移除第一个元素
    pTmp->m_pNextPer = temp->m_pNextPer;

    return temp;
}

/**
 * 向链表的末尾添加一个元素
 * @param pTmp
 * @param value
 */
void push(struct PerNode * pTmp, int value) {
    struct PerNode * l = pTmp->m_pNextPer;

    // 遍历到最后一个元素
    while (l != NULL && l->m_pNextPer != NULL) {
        l = l->m_pNextPer;
    }

    // 新建一个元素
    struct PerNode * node = malloc(sizeof(struct PerNode));
    node->m_iNumber = value;
    node->m_pNextPer = NULL;

    // 如果最后一个元素不为空则插入到它的后面
    if (l != NULL) {
        l->m_pNextPer = node;
    }
}

struct PerNode * josephus(struct PerNode *pTmp) {
    // 计数器,用来报数
    int i = 0;
    // 最后留在圈子中的元素
    struct PerNode * p;

    while (1) {
        // 模拟报数
        i++;
        // 取出一个元素
        struct PerNode * node = pop(*&pTmp);
        // 如果元素为 NULL,则说明没有人了
        if (node == NULL) {
            break;
        }

        // 如果这个人报数不是 3,则放回链表尾部
        if (i % 3 != 0) {
            push(*&pTmp, node->m_iNumber);
        }

        // 记录当前的元素
        p = node;
    }

    return p;
}

/**
 * 打印链表
 * @param l
 */
void printLink(struct PerNode * l)
{
    while (l != NULL) {
        printf("%d \n", l->m_iNumber);
        l = l->m_pNextPer;
    }

    printf("---------\n");
}

int main() {
    // 创建一个长度为13的链表
    struct PerNode *pHead = crtPrLst(13);
    // 找出最后在圈子中的人
    pHead = josephus(pHead);
    // 打印它的序号
    printf("%d \n", pHead->m_iNumber);
    
    return 0;
}

2018 年最后一篇文章。