2014-12-03 54 views
1

我在執行我的跳過列表時出現此問題,當我在int main()中出現return 0;時,出現堆損壞。這是我調試到的地方,直到它崩潰。我的跳過列表中存在堆損壞

Debug error

enter image description here

這是我的代碼:

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,但我不知道爲什麼。

任何人都可以幫我嗎?對不起,如果我問這個問題是錯誤的,我對堆棧溢出是一個新東西。提前致謝!

+1

不能做的崩潰,而是不斷播種用的時候你的RNG將意味着它一遍又一遍地返回相同的數,直到時間的變化,這可能不是你的意圖。 – 2014-12-03 15:59:49

+0

嗯,它會產生不同的輸出。也許我不太明白你的意思? – Thisen 2014-12-03 16:03:04

+1

你確定嗎? 'time'返回一個'time_t',在大多數平臺上是自紀元以來的秒數。你正在播種一個僞隨機數發生器,所以它應該返回相同的數字,直到時鐘改變到下一秒。 – 2014-12-03 16:16:28

回答

3

你在insert(T)的for循環中有off-by-one error,它可能應該是

for (int i = level-1; i >= 0; i--)

而且插入()泄漏內存,刪除insertNode