(C++)用循环单链表解决约瑟夫问题

用C++写一个循环链表模板类,且链表不带头节点... 用C++写一个循环链表模板类,且链表不带头节点 展开
 我来答
看天之
推荐于2017-09-10 · 超过13用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:36.7万
展开全部
#include <iostream>
using namespace std;

class MyNode
{
public:

    MyNode(int a_data):data(a_data),link(NULL) {}


    int    data;
    MyNode *link;
};

class Josephus
{
public:
    Josephus(int a_N, int a_K, int a_M):N(a_N),K(a_K),M(a_M)
    {
        createList();
        outputList();
    }

protected:
    void createList();
    void outputList();

private:
    MyNode *m_pHead;//循环链表的头节点
    int    N;     //链表节点个数
    int    K;     //第一个报数人的序号
    int    M;     //报数出局的数
};

void Josephus::createList()
{
    MyNode *pre = NULL;
    MyNode *cur = NULL;
    MyNode *p = new MyNode(1);
    m_pHead = p;
    cur = p;
    for (int i=2; i<=N; i++)
    {
        p = new MyNode(i);
        pre = cur;
        cur = p;
        pre->link = cur;
    }
    cur->link = m_pHead;

    int n=N;
    p = m_pHead;
    cout<<"原来顺序:";
    while (n--)
    {
        cout << p->data << ",";
        p = p->link;
    }
    cout << endl;
}

void Josephus::outputList()
{
    MyNode *pre = NULL;
    MyNode *cur = m_pHead;
    K--;
    while (K--)            //寻找第K个人(开始报数的人)
    {
        pre = cur;
        cur = cur->link;
    }
    cout<<"依次出列的数字:";
    while (N--)            //输出链表中所有的节点值
    {
        int s = M-1;
        while (s--)            //寻找间隔M的人
        {
            pre = cur;
            cur = cur->link;
        }
        MyNode *p = cur;
        if(N>=1)
        cout << p->data << ",";
        if(N==0)
        {
            cout<<p->data<<endl;
           cout<<"最后剩下的数字:"<<p->data<<endl;
        }

        cur = cur->link;    //删除节点的过程
        pre->link = cur;
        delete p;
        p=NULL;
    }
}

int main()
{
    Josephus josephus(8,1,3);
    return 0;
}

网上找的代码,稍微改了一下。应该符合要求。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式