K &のセクション6.6では、リンクリストを使用したハッシュテーブルについて説明しています。k&rからのテーブル検索インストール機能
つまり、ハッシュテーブルはポインタの配列です。ポインタは、リンクされたリストを指します。リンクされたリストは次のような構造体です。
struct nlist { /* table entry: */
struct nlist *next; /* next entry in chain */
char *name; /* defined name */
char *defn; /* replacement text */
};
名前はハッシュされており、このハッシュはテーブルのインデックスを決定します。私はこれを理解しようとすると、私は来続ける
np->next = hashtab[hashval];
hashtab[hashval] = np;
:
struct nlist *install(char *name, char *defn) {
struct nlist *np;
unsigned hashval;
if ((np = lookup(name)) == NULL) { /* not found */
np = (struct nlist *) malloc(sizeof(*np));
if (np == NULL || (np->name = strdup(name)) == NULL)
return NULL;
hashval = hash(name);
np->next = hashtab[hashval];
hashtab[hashval] = np;
} else /* already there */
free((void *) np->defn); /*free previous defn */
if ((np->defn = strdup(defn)) == NULL)
return NULL;
return np;
}
すべては、以下の2行を除き、理にかなって:章では、テーブルに名前/ DEFNのペアを追加するためのコードを示します結論として、リストは現在自身にリンクしており、リンクされたリストをトラバースしようとすると、それは自分の尾を追う犬のようになります。私はコードがNULLの隣にnp->を設定すると期待します。
私は何を理解していませんか?どのようにこのコードが動作するのですか?
+1これは参考になります。 – MByD
+1私の記事でポインタに関することを言います。確かなアドバイス。 –