Mục 6.6 của K & R thảo luận về bảng băm bằng danh sách được liên kết.Chức năng tra cứu bảng tra cứu từ k & r
Tóm lại, bảng băm là một mảng con trỏ. Các con trỏ trỏ đến một danh sách liên kết. Danh sách được liên kết là cấu trúc trông giống như:
struct nlist { /* table entry: */
struct nlist *next; /* next entry in chain */
char *name; /* defined name */
char *defn; /* replacement text */
};
Tên được băm và hàm băm này xác định chỉ mục trong bảng. Chương sau đó cho thấy mã để thêm một cặp tên/defn để bàn:
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;
}
Tất cả những gì có ý nghĩa ngoại trừ 2 dòng sau:
np->next = hashtab[hashval];
hashtab[hashval] = np;
Khi tôi cố gắng để hiểu điều này, tôi tiếp tục đến để kết luận rằng danh sách bây giờ liên kết lại cho chính nó và nếu bạn cố gắng đi qua danh sách liên kết nó sẽ giống như một con chó đuổi theo đuôi của nó. Tôi mong đợi mã để thiết lập np-> bên cạnh NULL.
Tôi không hiểu gì? Mã này hoạt động như thế nào?
+1 đó là quy tắc hữu ích – MByD
+1 Điều tôi cũng nói trong bài viết của mình về con trỏ. Lời khuyên vững chắc. –