24小时热门版块排行榜    

查看: 355  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 求调剂 +3 李李不服输 2026-03-25 3/150 2026-03-25 13:03 by cmz0325
[考研] 287求调剂 +10 晨昏线与星海 2026-03-19 11/550 2026-03-25 10:35 by userper
[考研] 考研化学308分求调剂 +10 你好明天你好 2026-03-23 11/550 2026-03-25 10:23 by userper
[考研] 一志愿中南大学化学学硕0703总分337求调剂 +6 niko- 2026-03-22 6/300 2026-03-25 09:14 by aa331100
[考研] 考研调剂 +4 呼呼?~+123456 2026-03-24 4/200 2026-03-24 23:16 by barlinike
[考研] 食品专硕 一志愿双一流 328 +3 xiaom99 2026-03-21 4/200 2026-03-24 21:20 by lailaisimei
[考研] 0854 考研调剂 招生了!AI 方向 +5 pk3725069 2026-03-19 17/850 2026-03-24 17:30 by zhouxuan..
[考研] 306求0703调剂一志愿华中师范 +10 纸鱼ly 2026-03-21 11/550 2026-03-24 17:22 by qingfeng258
[考研] 求调剂 +5 林之夕 2026-03-24 5/250 2026-03-24 17:16 by dick_runner
[考研] 一志愿哈工大,085400,320,求调剂 +3 gdlf9999 2026-03-24 3/150 2026-03-24 10:08 by 搏击518
[考研] 工科0856求调剂 +5 沐析汀汀 2026-03-21 5/250 2026-03-23 17:56 by 海瑟薇-
[考研] 293求调剂 +3 涛涛Wjt 2026-03-22 5/250 2026-03-22 22:21 by jiangpengfei
[考研] 材料与化工085600,总分304,本科有两篇sci参与,求调剂 +4 幸运的酱酱 2026-03-22 5/250 2026-03-22 20:15 by edmund7
[考研] 319求调剂 +4 小力气珂珂 2026-03-20 4/200 2026-03-22 15:53 by ColorlessPI
[考研] 考研调剂 +3 呼呼?~+123456 2026-03-21 3/150 2026-03-21 20:04 by 无际的草原
[考研] 0703化学297求调剂 +3 Daisy☆ 2026-03-20 3/150 2026-03-21 17:45 by ColorlessPI
[考研] 22 350 本科985求调剂,求老登收留 +3 李轶男003 2026-03-20 3/150 2026-03-21 13:28 by 搏击518
[考研] 317求调剂 +5 申子申申 2026-03-19 9/450 2026-03-20 22:26 by JourneyLucky
[考研] 一志愿 西北大学 ,070300化学学硕,总分287,双非一本,求调剂。 +4 晨昏线与星海 2026-03-19 4/200 2026-03-20 22:15 by JourneyLucky
[考研] 材料与化工 322求调剂 +4 然11 2026-03-19 4/200 2026-03-20 22:12 by luoyongfeng
信息提示
请填处理意见