Bonsoir,
Pour mon cours d'algorithmique il m'a été demandé d'implémenter une skiplist, j'ai un soucis dans la méthode de ma classe SkipList qui réalise l'insertion des données.
Voici mon code pour la classe SkipList :
Et celui de ma classe Node :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 #include <cstdlib> #include <time.h> #include "skiplist.hpp" using namespace std; SkipList::SkipList() :level(0),size(0),proba(.5) { head = new Node(0, 32); srand (time(NULL)); } SkipList::~SkipList() { Node *prec = NULL; for(Node *n = head; n != NULL; n = n->getNextAtLevel(0)) { delete prec; prec = n; } delete prec; } bool SkipList::contains(const int &key) const { Node *current = head; for(int i = level; i >= 0; --i) if(current->getNextAtLevel(i)) { while(current->getNextAtLevel(i)->getKey() < key) { current = current->getNextAtLevel(i); if(!current->getNextAtLevel(i)) break; } if(current->getNextAtLevel(i)) if(current->getNextAtLevel(i)->getKey() == key) return true; } return false; } void SkipList::add(const int &key) { unsigned nodeSize = 1; unsigned val = 1; while(val) { val = rand()%2; if(val) ++nodeSize; } if(nodeSize > level) level = nodeSize - 1; Node *newNode = new Node(key, nodeSize); Node *current = head; for(int i = level; i >= 0; --i) { if(!current->getNextAtLevel(i)) { if(i < nodeSize) current->setNextAtLevel(i, newNode); continue; } while(1) { if(current->getNextAtLevel(i)) { if(current->getNextAtLevel(i)->getKey() < key) current = current->getNextAtLevel(i); else break; } else break; } if(current->getNextAtLevel(i)) if(current->getNextAtLevel(i)->getKey() == key) { delete newNode; return; } if(current->getNextAtLevel(i)) if(current->getNextAtLevel(i)->getKey() > key) { newNode->setNextAtLevel(i, current->getNextAtLevel(i)); current->setNextAtLevel(i, newNode); } ++size; } }
Le problème semble se situer à la ligne 85 de SkipList.cpp, en effet l'appel de la fonction getNextAtLevel() renvoi 0x21 sous linux et 0xabababab sous windows. J'ai eu beau retourné le problème dans tous les sens je ne vois pas où se situe mon erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #include "node.hpp" Node::Node(const int &key, const unsigned &size) :key(key), size(size) { next = new Node *[size]; for(unsigned i = 0; i < size; ++i) next[i] = NULL; } Node::~Node() { delete []next; } unsigned Node::getSize() const { return size; } int Node::getKey() const { return key; } Node* Node::getNextAtLevel(const unsigned &level) const { return next[level]; } void Node::setNextAtLevel(const unsigned &level, Node *node) { next[level] = node; }
Partager