鱼C论坛

 找回密码
 立即注册
查看: 1479|回复: 0

请教各位大虾,为什么我的链表会陷入死循环呢?

[复制链接]
发表于 2014-11-3 01:08:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:
#include <iostream>
using namespace std;
template <class T>
class Chain;
template <class T>
class ChainNode
{
        friend class Chain<T>;
        friend ostream& operator<< <T>(ostream& out, const Chain<T>& x);
private:
        T data;
        ChainNode<T>* link = 0;
};


//重载 <<
template<class T>
ostream& operator<< (ostream& out, const Chain<T>& x)
{
        ChainNode<T>* p;
        for (p = x.first; p; p = p->link)
        {
                out << p->data << "->";
        }
        return out;
}


template <class T>
class Chain
{
        friend ostream& operator<< <T>(ostream& out, const Chain<T>& x);
public:
        Chain(){ first = 0; }
        Chain<T>& InsertChange(int k);
        void split(Chain& A, Chain& B);
private:
        ChainNode<T>* first;//指向第一个节点的指针
};



int main()
{
        Chain<int> test;
        for (int i = 0; i < 10; i++)
        {
                test.InsertChange(i);
        }
        cout << test << endl;
        Chain<int> A, B;
        test.split(A, B);
        cout << A << endl;
        cout << B << endl;
        return 0;

}

template <class T>
Chain<T>& Chain<T>::InsertChange(int k)
{
        ChainNode<T>* p = new ChainNode<T>;
        ChainNode<T>* q;
        p->data = k;
        if (!first)
        {
                first = p;
        }
        else
        {
                q = first;
                while (q->link)
                {
                        q = q->link;
                }
                q->link = p;
        }
        return *this;
}

template<class T>
void Chain<T>::split(Chain& A, Chain& B)
{
        ChainNode<T>* p = first;
        ChainNode<T>* q = 0;
        ChainNode<T>* r = 0;
        int i = 0;
        while (p)
        {
                if (first == NULL)
                {
                        return;
                }
                i++;
                if (i % 2 != 0)
                {
                        q = p;
                        q->link = q;
                }
                else
                {
                        r = p;
                        r->link = r;
                }
                p = p->link;
        }
        A.first = q;
        B.first = r;
        return;

}
只是在拆分这个函数出现死循环
template<class T>
void Chain<T>::split(Chain& A, Chain& B)
{
        ChainNode<T>* p = first;
        ChainNode<T>* q = 0;
        ChainNode<T>* r = 0;
        int i = 0;
        while (p)
        {
                if (first == NULL)
                {
                        return;
                }
                i++;
                if (i % 2 != 0)
                {
                        q = p;
                        q->link = q;
                }
                else
                {
                        r = p;
                        r->link = r;
                }
                p = p->link;
        }
        A.first = q;
        B.first = r;
        return;

}
还请多多指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 05:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表