#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本身。或者我是问题因为没有看到明显或缺乏基础的东西。
答案 0 :(得分:2)
LinkedList
析构函数中存在问题。
当您将next
的{{1}}元素指定为l[4]
时,基本上您有周期(这似乎是您想要的)。
但最后一个元素(l[1]
)指向现有元素。
因此,在析构函数中,您试图两次销毁l[4]
:第一次删除l[1]
之后,第二次删除l[0]
之后。
您应该检查列表的设计,特别是销毁它的方式。