我在執行我的跳過列表時出現此問題,當我在int main()
中出現return 0;
時,出現堆損壞。這是我調試到的地方,直到它崩潰。我的跳過列表中存在堆損壞
這是我的代碼:
skipnode.h
template <typename T>
class SkipNode
{
public:
T data;
SkipNode<T> **next;
SkipNode(T d, int level);
~SkipNode();
};
skipnode.cpp
#include "skipnode.h"
template<typename T>
SkipNode<T>::SkipNode(T d, int level)
{
data = d;
next = new SkipNode<T>*[level];
for (int i = 0; i < level; i++)
next[i] = 0;
}
template<typename T>
SkipNode<T>::~SkipNode()
{
delete [] next;
}
skiplist.h
#include "skipnode.cpp"
#define MAXLEVEL 4
template<typename T>
class SkipList
{
public:
SkipList();
~SkipList();
int randLvl(int max);
T search(T);
void insert(T);
private:
SkipNode<T> *root;
};
skiplist.cpp
#include "skiplist.h"
#include <stdlib.h>
#include <time.h>
template<typename T>
SkipList<T>::SkipList()
{
root = new SkipNode<T>(0,MAXLEVEL);
}
template<typename T>
SkipList<T>::~SkipList()
{
delete root;
}
template<typename T>
int SkipList<T>::randLvl(int max)
{
srand(time(NULL));
return rand() % max + 1; //+ 1, så værdien ikke bliver 0
}
template<typename T>
void SkipList<T>::insert(T value)
{
int level = randLvl(MAXLEVEL);
SkipNode<T> *insertNode = new SkipNode<T>(value,level);
SkipNode<T> *currentNode = root;
for (int i = level; i > 0; i--)
{
for (; currentNode->next[i] != 0; currentNode = currentNode->next[i])
{
if (currentNode->next[i]->data > value)
break;
}
if (i <= level)
{
insertNode->next[i] = currentNode->next[i];
currentNode->next[i] = insertNode;
}
}
}
的main.cpp
#include "skiplist.cpp"
int main()
{
SkipList<int> SList;
SList.insert(3);
return 0;
}
我有一個理論,該錯誤可能會在此行中skiplist.cpp來發生的事情:
if (currentNode->next[i]->data > value)
因爲它似乎就像它不能訪問next-> data,但我不知道爲什麼。
任何人都可以幫我嗎?對不起,如果我問這個問題是錯誤的,我對堆棧溢出是一個新東西。提前致謝!
不能做的崩潰,而是不斷播種用的時候你的RNG將意味着它一遍又一遍地返回相同的數,直到時間的變化,這可能不是你的意圖。 – 2014-12-03 15:59:49
嗯,它會產生不同的輸出。也許我不太明白你的意思? – Thisen 2014-12-03 16:03:04
你確定嗎? 'time'返回一個'time_t',在大多數平臺上是自紀元以來的秒數。你正在播種一個僞隨機數發生器,所以它應該返回相同的數字,直到時鐘改變到下一秒。 – 2014-12-03 16:16:28