乌龟和野兔没有地址,C ++

时间:2017-09-27 16:07:32

标签: c++

#include <iostream>

using namespace std;

class Element
{
public:
    Element* next;
    double field;
};

class LinkedList
{
protected:
    Element* begin;
    int num;
public:
    int Number() {return num;}
    LinkedList() 
    {
        begin = NULL;
        num = 0;
    }
    LinkedList(LinkedList& L) 
    {
        begin = new Element;
        num = L.Number();
        begin = L.begin;
    }

    virtual void push(double a)
    {
        Element* cur = begin;
        if(begin==NULL)
        {
            num = 1;
            begin = new Element;
            begin->field = a;
            begin->next = NULL;
            return;
        }

        while(cur->next!=NULL)
        {
            cur = cur->next;
        }
        num ++ ;

        cur->next = new Element;
        cur->next->field = a;
        cur->next->next = NULL;
    }
    virtual double pop()
    {
        Element* cur = begin;
        Element* prev = NULL;

        if(begin==NULL)
        {
            return -1;
        }
        if(num==1)
        {
            double res = begin->field;
            num--;
            return res;
        }

        while(cur->next!=NULL)
        {
            prev = cur;
            cur = cur->next;
        }
        double res = cur->field;
        prev->next = NULL;
        delete cur;
        num--;
        return res;
    }

    ~LinkedList()
    {
        num = 0;
        Element* cur = begin;
        if(cur!=NULL)
            cur = cur->next;
        while(cur!=NULL)
        {
            Element* prev = cur;
            cur = cur->next;
            delete prev;
        }
        if(begin!=NULL)
            delete begin;
    }
    Element* operator[](int i)
    {
        if(i<0 || i>num) return NULL;
        int k = 0;
        Element* cur = begin;
        for(k=0;k<i;k++)
        {
            cur = cur->next;
        }
        return cur;
    }
};

class R_LinkedList: public LinkedList{
public:

    double pop() {
        double res = begin->field;
        begin = begin->next;
        num--;
        return res;
    }
    bool cycle_search() {
        Element* tortoise = begin, *hare = begin;

        while(tortoise && hare && hare->next) {
            tortoise = tortoise->next;
            hare = hare->next->next;
            if(tortoise == hare) {
                cout << "Got loop" << endl;
                return 1;
            }           
        }
        cout << "No loop" << endl; return 0;
    }
};

int main()
{
    R_LinkedList l;
    l.push(2); l.push(3); l.push(6);l.push(3);l.push(6);
    cout  << l[2]->field << endl;
    l[4]->next = l[1];
    l.cycle_search();
    return 0;
}

向下滚动,然后向上滚动。

所以我有这个代码并试图实现经典的#34;乌龟和野兔&#34;循环查找algorythm(并且还过载虚函数,但这还不是问题)。它工作正常!它打印出价值,它高兴地说,#34;得到了循环!&#34; 然后它打破了,尖叫

HEAP[TestConsole2.exe]: Invalid address specified to RtlValidateHeap( 002E0000, 002EF8F0 )

地址问题。喜爱。老实说试图调试,他一直在最后工作,并再次破产。所以它与析构函数有关,但是 - 地狱 - 不知道到底是什么。 或者它可能是关于algorythm本身。或者我是问题因为没有看到明显或缺乏基础的东西。

1 个答案:

答案 0 :(得分:2)

LinkedList析构函数中存在问题。 当您将next的{​​{1}}元素指定为l[4]时,基本上您有周期(这似乎是您想要的)。 但最后一个元素(l[1])指向现有元素。 因此,在析构函数中,您试图两次销毁l[4]:第一次删除l[1]之后,第二次删除l[0]之后。 您应该检查列表的设计,特别是销毁它的方式。