Sección 6.6 de K & R analiza una tabla hash utilizando una lista vinculada.Función de instalación de búsqueda de tabla de k & r
En resumen, una tabla hash es una matriz de punteros. Los punteros apuntan a una lista vinculada. La lista enlazada es una estructura que se parece a:
struct nlist { /* table entry: */
struct nlist *next; /* next entry in chain */
char *name; /* defined name */
char *defn; /* replacement text */
};
es ordenado el nombre, y este hash determina el índice en la tabla. Luego, el capítulo muestra el código para añadir un par nombre/defn a la mesa:
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;
}
Todo tiene sentido, excepto para los siguientes 2 líneas:
np->next = hashtab[hashval];
hashtab[hashval] = np;
Cuando trato de entender esto, me siguen llegando a la conclusión de que la lista ahora se vincula a sí misma y si tratas de atravesar la lista enlazada será como un perro persiguiendo su propia cola. Esperaría que el código establezca np-> al lado de NULL.
¿Qué no entiendo? ¿Cómo es que funciona este código?
+1 eso es una regla útil – MByD
+1 Algo que también digo en mi artículo sobre punteros. Sólido consejo. –