내 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에 접근 할 수없는 것처럼 보이지만, 나는 왜 그런지 모른다.
아무도 도와 줄 수 있습니까? 미안하지만 질문을 잘못하면 Stack Overflow에 익숙해졌습니다. 미리 감사드립니다!
하지 충돌과 관련,하지만 지속적으로 시간과의 RNG를 심는 것은 아마 인, 시간이 변경 될 때까지 반복해서 같은 수를 반환한다는 것을 의미합니다 당신이 의도 한 것. –
흠, 출력이 다릅니다. 아마 니가 무슨 뜻인지 이해하지 못했을거야? – Thisen
정말입니까? 'time'은'time_t'를 반환하는데, 대부분의 플랫폼에서 그 시간 이후의 초 수가됩니다. 의사 랜덤 넘버 생성기를 사용하면 시계가 다음 초로 변경 될 때까지 같은 번호를 반환해야합니다. –