В разделе 6.6 K & R обсуждается хеш-таблица с использованием связанного списка.
Короче говоря, хеш-таблица представляет собой массив указателей.Указатели указывают на связанный список.Связанный список - это структура, которая выглядит следующим образом:
struct nlist { /* table entry: */
struct nlist *next; /* next entry in chain */
char *name; /* defined name */
char *defn; /* replacement text */
};
Имя хэшируется, и этот хэш определяет индекс в таблице.Затем в главе показан код для добавления пары имя / определение в таблицу:
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 строк:
np->next = hashtab[hashval];
hashtab[hashval] = np;
Когда я пытаюсь это понятьЯ продолжаю приходить к выводу, что список теперь связан с самим собой, и если вы попытаетесь пройти по связанному списку, он будет похож на собаку, преследующую свой собственный хвост.Я ожидал бы, что код установит np-> рядом с NULL.
Что я не понимаю?Почему этот код работает?