在K&R的C程序设计语言中,Hashtable的实现非常简单且易于理解。不过,它的有效性在某些情况下会受到影响。
下面是Hashtable的代码示例:
#define HASHSIZE 101
typedef struct ListNode ListNode;
typedef struct Hashtable Hashtable;
struct ListNode {
char *key;
char *value;
ListNode *next;
};
struct Hashtable {
ListNode *table[HASHSIZE];
};
unsigned hash(char *s) {
unsigned hashval;
for (hashval = 0; *s != '\0'; s++)
hashval = *s + 31 * hashval;
return hashval % HASHSIZE;
}
ListNode *lookup(Hashtable *htable, char *key) {
ListNode *np;
for (np = htable->table[hash(key)]; np != NULL; np = np->next)
if (strcmp(key, np->key) == 0)
return np; // if found
return NULL; // if not found
}
ListNode *addnode(Hashtable *htable, char *key, char *value) {
ListNode *np;
unsigned hashval;
if ((np = lookup(htable, key)) == NULL) { // if not already in the hash table
np = (ListNode *)malloc(sizeof(*np));
if (np == NULL || (np->key = strdup(key)) == NULL)
return NULL;
hashval = hash(key);
np->next = htable->table[hashval];
htable->table[hashval] = np;
} else {
free((void *)np->value); // free the old value
}
if ((np->value = strdup(value)) == NULL)
return NULL;
return np;
}
void deletenode(Hashtable *htable, char *key) {
ListNode *np, *prev;
unsigned hashval = hash(key);
for (np = htable->table[hashval], prev = NULL; np != NULL; prev = np, np = np->next) {
if (strcmp(key, np->key) == 0) {
if (prev == NULL) {
h