自分用にスキップリストを実装していますが、C++ でいくつかの問題が発生しています。私は2つの構造を持っています:
スキップリストのノード - その int 値と、他のノードへのポインターの配列へのポインターを保持します。
struct node{ int val; node** next; };
リスト (センチネル) の先頭と末尾へのポインタを保持する Skiplist。
struct skiplist{ node *head, *tail; };
また、スキップリスト構造へのポインターを返す関数があります (この関数を使用してスキップリストを初期化します)。
skiplist* createSkipList(){
skiplist* l = new skiplist;
node* listHead = new node;
node* listTail = new node;
node* headNext[MAX_LEVEL]; //array of pointers
listHead->next = headNext;
for(int i=0; i<MAX_LEVEL; i++){
listHead->next[i] = listTail;
}
l->head=listHead;
l->tail=listTail;
}
そして、 main() 関数で次のように呼び出します。
skiplist* skiplist=createSkipList();
関数ではすべて正常に動作createSkipList()
しますが、main() でスキップリストを参照したい場合、つまりskiplist->tail
プログラムにアクセスしてクラッシュします。関連する投稿を探していましたが、役に立ちませんでした。
同様の投稿で述べたように、new
演算子を使用して構造体を割り当てているため、ダングリング ポインターが発生することはありません。ヒントをいただければ幸いです;)