24小时热门版块排行榜    

查看: 417  |  回复: 2

冰雨hust

铁虫 (小有名气)

[求助] C++数据结构循环链表约瑟夫问题

#include <iostream>
using namespace std;

template <class T>
struct Node
{
        T data;
    Node<T> *next;
};

template <class T>
class CLinkList
{
public:
        CLinkList(){rear=new Node<T>;rear->next=rear;}
        CLinkList(T a[],int n);
        int Josephus(int m,int n);
private:
        Node <T> *rear;
};

template <class T>
CLinkList<T>::CLinkList(T a[],int n)
{
        rear=new Node<T>;
        rear->next=rear;
        for (int i=0;i<n;i++)
        {
                Node <T>*s=new Node <T>;
                s->data = a;
                s->next = rear->next;
                rear->next = s;
                rear = s;
        }
        Node <T>*p = rear->next;
        rear->next = p->next;
        delete p;
}

template <class T>
int CLinkList<T>::Josephus(int m,int n)
{
        int x,i;
        Node <T>*p=rear->next;
        if (n==1||m==1)
        {
                x=n;
        }
        else
        {
                while(n!=1)
                {
                        i=1;
                        while (p&&i!=(m-1))
                        {
                                p=p->next;
                                i++;
                        }
                        Node <T> *q = p->next;
                        p->next = q->next;
                        delete q;
                        p = p->next;
                        n--;
                }
                rear=p;
                x=p->data;
        }
        return x;
}

int main()
{
        int M,N,a[1024];
        cout<<"the number of people:";
        cin>>N;
        if (N>=1024)
        {
                cout<<"Error!Please put in a smaller number.";
                return 0;
        }
        cout<<"the number they count:";
        cin>>M;
        if (M<=0)
        {
                cout<<"Error!Please put in a positive number:";
                return 0;
        }
        for (int i=0;i<N;i++)
        {
                a = i+1;
        }
        CLinkList<int> A(a,N);
        cout<<"the last number is:"<<A.Josephus(M,N)<<endl;
        return 0;
}

我不知道在template <class T>
CLinkList<T>::CLinkList(T a[],int n)的最后为啥要加上:
       Node <T>*p = rear->next;
        rear->next = p->next;
        delete p;
这一段代码,请高人指点,谢谢~~~
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

感谢参与,应助指数 +1
有2个问题,CLinkList<T>::CLinkList(T a[],int n)中这一句
CODE:
s->data = a;

少了[],应是a
int main()里面也一样,a = i+1;应该是a

然后看你问的那段代码:
CODE:
CLinkList<T>::CLinkList(T a[],int n)
{
        rear=new Node<T>;
        rear->next=rear;

生成一个哑节点(也就是多余的),没有任何数据,用来表示链表结尾.其next指向自身(添加数据后会被删除).
CODE:
        for (int i=0;i<n;i++)
        {
                Node <T>*s=new Node <T>;
                s->data = a;
                s->next = rear->next;
                rear->next = s;
                rear = s;
        }

循环添加数据,添加顺序为:生成新节点s,给s数据赋值,s指向next哑节点rear,哑节点next指向s,然后移动rear指针到新节点s(这时候所谓的rear其实变成了最后一个非空结点),画图就是:
添加前只有rear:
[rear][null][next]
↑___________|
添加后(只加一个),有2个元素,s1和rear:
[s1(循环最后一句赋值后变成rear)][data][next] ----→ [原rear(复制后没有指针指向这里,只能通过新的rear的next访问)][null][next]
↑_______________________________________________________________________________________________________|
添加2个后变成s1和s2和rear
[s1][data][next]  ---→  [s2(新的rear)][data][next]  ---→   [原rear][null][next]
↑___________________________________________________________|
循环下去可以看到,rear永远指向最后一个非空节点,也就是新添加的那个s.
CODE:
        Node <T>*p = rear->next;
        rear->next = p->next;
        delete p;
}

创建一个指针,指向空节点(rear的下一个),让最后一个非空节点指向头结点.删除空节点.循环链表生成完成.
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
2楼2013-06-17 16:41:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

方括号a【i】(a[i])没法显示?
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2013-06-17 16:42:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 冰雨hust 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +4 k0dTPqJtl0jt 2026-08-14 4/200 2026-08-15 02:21 by 4wMiSEwB6436
[基金申请] 各位道友,我要去昆明玩几天,回来见。 +7 Tide man 2026-08-14 8/400 2026-08-15 01:11 by arzu_hma
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 22/1100 2026-08-14 23:45 by Noways
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +5 Ldrop2023 2026-08-13 5/250 2026-08-14 18:48 by ssxclkj
[基金申请] filecode +6 cratir 2026-08-14 10/500 2026-08-14 18:29 by 笑叹辞穷
[基金申请] 应该是93bebmhtak前后十一个字符比较关键 +23 Lanmanbaby 2026-08-09 37/1850 2026-08-14 13:40 by Equinoxhua
[硕博家园] 读博的好处 +4 lnee 2026-08-11 4/200 2026-08-14 10:20 by ahsoarli
[基金申请] filecode +15 documentary 2026-08-10 17/850 2026-08-14 10:08 by kissu88
[基金申请] 关于Filecode分析方法 +9 majunge000 2026-08-10 12/600 2026-08-13 23:20 by iwuli
[文学芳草园] 阿姨 +4 汪汪锅 2026-08-09 4/200 2026-08-13 19:43 by arzu_hma
[硕博家园] 一作与独作在应聘高校教师时区别大吗 +3 mbygzh 2026-08-08 4/200 2026-08-13 19:31 by 龙-樱
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +11 Tide man 2026-08-11 11/550 2026-08-13 07:35 by 撸猫猫
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
[基金申请] 这样的filecode谁见过 +11 布布和一二 2026-08-08 22/1100 2026-08-10 11:10 by wmfsnow
[基金申请] 面上项目filecode邪修 +5 西山十月 2026-08-09 7/350 2026-08-10 07:32 by 仁砚薪传
[基金申请] fileCode有新解读? +10 Tide man 2026-08-08 18/900 2026-08-09 12:55 by 仁砚薪传
信息提示
请填处理意见