基於鏈表編寫「貓吃老鼠」

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;}
};
老鼠的結構,除了自己的編號,關鍵的是定義了下一個指向。
然後編寫「吃老鼠動作」
MouseNodeC貓吃老鼠鏈表操作Dlg::CatEatmouses(MouseNodepStartMouse)
{
 
    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也是單向鏈表,但是目前還沒有看過寫得非常好的代碼,感覺使用起來不如直接使用感覺利索。





目前方向:圖像拼接融合、圖像識別 聯繫方式: [email protected]