2014-12-03 6 views
1

int main()return 0;이있을 때 힙 손상이 발생하는 건너 뛰기 목록 구현에서이 문제가 발생합니다. 그것은 추락 할 때까지 내가 디버깅 한 곳에서 최소한이다. 내 건너 뛰기 목록의 힙 손상

enter image description here

Debug error

내 코드입니다 :

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에 접근 할 수없는 것처럼 보이지만, 나는 왜 그런지 모른다.

아무도 도와 줄 수 있습니까? 미안하지만 질문을 잘못하면 Stack Overflow에 익숙해졌습니다. 미리 감사드립니다!

+1

하지 충돌과 관련,하지만 지속적으로 시간과의 RNG를 심는 것은 아마 인, 시간이 변경 될 때까지 반복해서 같은 수를 반환한다는 것을 의미합니다 당신이 의도 한 것. –

+0

흠, 출력이 다릅니다. 아마 니가 무슨 뜻인지 이해하지 못했을거야? – Thisen

+1

정말입니까? 'time'은'time_t'를 반환하는데, 대부분의 플랫폼에서 그 시간 이후의 초 수가됩니다. 의사 랜덤 넘버 생성기를 사용하면 시계가 다음 초로 변경 될 때까지 같은 번호를 반환해야합니다. –

답변

3

당신에게 insert(T)에서 for 루프에 off-by-one error이, 아마해야

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

또한, 메모리 누수) (삽입, 삭제 insertNode