スキップリストがどのように機能するかについての基本的な理解があると思いますが、C初心者であることに加えて、スキップリストに慣れていないため、いくつかの点、特にリストの初期化で混乱しています。これが私が従おうとしているコードです:
#define MAXSKIPLEVEL 5
typedef struct Node {
int data;
struct Node *next[1];
} Node;
typedef struct SkipList {
Node *header;
int level;
} SkipList;
// Initialize skip list
SkipList* initList() {
SkipList *list = calloc(1, sizeof(SkipList));
if ((list->header = calloc(1, sizeof(Node) + MAXSKIPLEVEL*sizeof(Node*))) == 0) {
printf("Memory Error\n");
exit(1);
}
for (int i = 0; i < MAXSKIPLEVEL; i++)
list->header->next[i] = list->header;
return list;
}
私はまだ C でポインターの配列を使って何もしていません。誰かが私を助けてくれるほど親切かどうか、いくつか質問があります。
最初にやっsizeof(int)
たら 4sizeof(Node*)
が出て 8 だったのでsizeof(Node)
12 になると思っていたのに 16 になってしまったのはなぜですか? SkipList
その内容のサイズと比較してのサイズと同じ混乱。どちらが原因なのかtypedef
アンドを取り出してみましたが、サイズは16のままでした。[1]
次に、[1] が にあるのはなぜstruct Node *next[1]
ですか? list->header->next[i]
後で必要ですか?next[i]
1を超えても大丈夫ですか?各ノードのポインターの数が可変であるという理由だけで、配列にして後で個別に増やしますか?
第三に、なぜlist->header->next[i] = list->header
最初は代わりにNULL
?
アドバイス/コメントは大歓迎です、ありがとう。