Sekcja 6.6 K & R omawia tablicę skrótów za pomocą połączonej listy.Funkcja instalacji wyszukiwania tabeli z k & r
W skrócie, tablica skrótów jest tablicą wskaźników. Wskaźniki wskazują na połączoną listę. Połączony lista jest struktura, która wygląda następująco:
struct nlist { /* table entry: */
struct nlist *next; /* next entry in chain */
char *name; /* defined name */
char *defn; /* replacement text */
};
Nazwa jest mieszany, a to hash określa indeks w tabeli. Rozdział następnie pokazuje kod, aby dodać parę nazwa/defn do stołu:
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;
}
Wszystko ma sens, z wyjątkiem następujących 2 linie:
np->next = hashtab[hashval];
hashtab[hashval] = np;
Kiedy próbuję zrozumieć to, trzymam nadchodzi do wniosku, że lista jest teraz powiązana z samym sobą, a jeśli spróbujesz przejść na połączoną listę, będzie to wyglądało jak pies goniący swój własny ogon. Oczekuję, że kod ustawi np-> obok NULL.
Czego nie rozumiem? Dlaczego ten kod działa?
+1 To przydatna zasada – MByD
+1 Coś, co również powiem w moim artykule na temat wskaźników. Solidna rada. –