博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于链表编写“猫吃老鼠”
阅读量:5815 次
发布时间:2019-06-18

本文共 1555 字,大约阅读时间需要 5 分钟。

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也是单向链表,但是目前还没有看过写得非常好的代码,感觉使用起来不如直接使用感觉利索。

转载地址:http://jrmbx.baihongyu.com/

你可能感兴趣的文章
把Linux作为工作使用的系统
查看>>
前端利用Blob对象创建指定文件并下载
查看>>
ZooKeeper 官方教程[翻译]
查看>>
java的3大特性
查看>>
Telegraf+SNMP+Grafana构建企业级交换机监控
查看>>
复盘在mac上编译6.0源码
查看>>
OKio源码解析
查看>>
Java Activiti 工作流引擎 springmvc SSM 流程审批 后台框架源码
查看>>
解析Vue-router相关干货及工作原理
查看>>
微信小程序样式入门到精通(wxss)视频课程005-小程序中创建样式的几种写法
查看>>
前端设计模式及应用
查看>>
对前端状态管理的个人理解
查看>>
sublime text 3安装格式化json的插件
查看>>
Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
查看>>
Redis为什么是单线程、及高并发快的大原因详解
查看>>
1.8 Android SQLite数据库
查看>>
使用HTML/CSS/JS开发轻量级跨平台桌面APP
查看>>
拯救 Java Code Style 强迫症
查看>>
iOS11适配遇到的问题
查看>>
命令01-MATLAB命令
查看>>