私はスキップリストをグーグルで検索し、「アルゴリズムの紹介」 http://epaperpress.com/sortsearch/index.htmlという本を見つけ、次のhttp://epaperpress.com/sortsearch/skl.html からスキップリストのチュートリアルサンプルを入手しました
正常に動作している skl.c がありますが、コードを調べていると、次のように混乱することがわかりました。
typedef int keyType; /* type of key */
/* user data stored in tree */
typedef struct {
int stuff; /* optional related data */
} recType;
/* levels range from (0 .. MAXLEVEL) */
#define MAXLEVEL 15
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[1]; /* skip list forward pointer */
} nodeType;
/* implementation independent declarations */
typedef struct {
nodeType *hdr; /* list Header */
int listLevel; /* current level of list */
} SkipList;
SkipList list; /* skip list information */
そして私を混乱させた機能は次のとおりです:
void initList() {
int i;
/**************************
* initialize skip list *
**************************/
if ((list.hdr = malloc(
sizeof(nodeType) + MAXLEVEL*sizeof(nodeType *))) == 0) {
printf ("insufficient memory (initList)\n");
exit(1);
}
for (i = 0; i <= MAXLEVEL; i++)
list.hdr->forward[i] = NIL;
list.listLevel = 0;
}
このテストでは MAXLEVEL = 15 のように見えるので、 initList() では list.hdr->forward[0] = NIL; を実行します。list.hdr->forward[15] = NIL へ。そして nodeType structure を見てください。それには forward var struct nodeTag *forward[1]; があります。、struct nodeTag *forward[MAXLEVEL]; ではありません。
正しい構造は次のようにする必要があると思います:
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[MAXLEVEL]; /* skip list forward pointer */
} nodeType;
いいえ
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[1]; /* skip list forward pointer */
} nodeType;
または私は何かを逃した?