基于链表编写“猫吃老鼠”

2023-10-06 22:50
文章标签 链表 编写 老鼠

本文主要是介绍基于链表编写“猫吃老鼠”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://pan.baidu.com/s/1nvaTki1

这是一个简单的链表操作问题

"现有n个老鼠围成一圆圈,有一只猫从任意位置开始吃老鼠,每次都隔一个老鼠吃,请给出最后一个老鼠的编号?"
题目的具体要求是给出任给老鼠数n,输出猫最后吃的老鼠的编号。 
思考这样的一个问题,由于涉及到从数据队列中间删除数据(相对于从开头和结尾删除数据),所以需要使用链表。
在现在的编程环境中,链表的操作可以使用std,也可以使用自己编写的链表。由于这里是kata,所以两种方式都采用。
链表分为单向链表和双向链表,由于“猫吃老鼠”是一个单向循环的操作,所以采用单向链表就可以。
首先定义数据结构
typedef struct MouseNode
{
    int iNO;
    MouseNode *pNext;
    MouseNode(){iNO = 0;pNext = nullptr;}
    MouseNode(int i){iNO = i;pNext = nullptr;}
};
老鼠的结构,除了自己的编号,关键的是定义了下一个指向。
然后编写“吃老鼠动作”
MouseNode* C猫吃老鼠链表操作Dlg::CatEatmouses(MouseNode* pStartMouse)
{
    MouseNodepThis  = pStartMouse;
    pThis->pNext = pThis->pNext->pNext;
    pThis = pThis->pNext;
    return pThis;
}
最后编写事件驱动
void C猫吃老鼠链表操作Dlg::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    int nMouseCount = GetDlgItemInt(IDC_EDIT_INPUT);
    if(nMouseCount <= 1)
    {
        m_iResult = 1;//结果为1
        return ;
    }
    // 开辟N个老鼠内存并初始化 
    MouseNode *pMouseBuffer = new MouseNode[nMouseCount];
    // 初始化双向链表 
    pMouseBuffer[0].pNext = &pMouseBuffer[1];
    pMouseBuffer[0].iNO = 1;
    pMouseBuffer[nMouseCount - 1].pNext = &pMouseBuffer[0];
    pMouseBuffer[nMouseCount - 1].iNO = nMouseCount;
    for(int i = 1;i < nMouseCount - 1;i++)
    {
        pMouseBuffer[i].pNext = &pMouseBuffer[i + 1];
        pMouseBuffer[i].iNO = i + 1;
    }
    // 开始吃老鼠 
    MouseNode *pNextEatMouse = &pMouseBuffer[nMouseCount-1];
    while (TRUE)
    {
        if(pNextEatMouse->pNext == pNextEatMouse)
        {
            break//当链表中只有一个元素的时候退出
        }
        pNextEatMouse = CatEatmouses(pNextEatMouse);
    }
    m_iResult = pNextEatMouse->iNO;
    delete[] pMouseBuffer;
    SetDlgItemInt(IDC_EDIT_RESULT,m_iResult);
}
并且实现界面
虽然std::forward_list也是单向链表,但是目前还没有看过写得非常好的代码,感觉使用起来不如直接使用感觉利索。



来自为知笔记(Wiz)



目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

这篇关于基于链表编写“猫吃老鼠”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154406

相关文章

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不