HashNode addhashnode2(HashTable ht, char *nam, void *nodeptr) { unsigned hashval; HashNode hn, hp, hq; hn = (HashNode) nodeptr; hn->nam = nam; hashval = ht->hash(hn->nam) % ht->hsize; hp = ht->nodes[hashval]; /* check if this is the first node for this hash value */ if (!hp) { hn->next = NULL; ht->nodes[hashval] = hn; if (++ht->ct >= ht->hsize * 2 && !ht->scan) expandhashtable(ht); return NULL; } /* else check if the first node contains the same key */ if (ht->cmpnodes(hp->nam, hn->nam) == 0) { ht->nodes[hashval] = hn; replacing: hn->next = hp->next; if(ht->scan) { if(ht->scan->sorted) { HashNode *tab = ht->scan->u.s.tab; int i; for(i = ht->scan->u.s.ct; i--; ) if(tab[i] == hp) tab[i] = hn; } else if(ht->scan->u.u == hp) ht->scan->u.u = hn; } return hp; } /* else run through the list and check all the keys */ hq = hp; hp = hp->next; for (; hp; hq = hp, hp = hp->next) { if (ht->cmpnodes(hp->nam, hn->nam) == 0) { hq->next = hn; goto replacing; } } /* else just add it at the front of the list */ hn->next = ht->nodes[hashval]; ht->nodes[hashval] = hn; if (++ht->ct >= ht->hsize * 2 && !ht->scan) expandhashtable(ht); return NULL; }
void addhashnode(HashTable ht, char *nam, void *nodeptr) { unsigned hashval; HashNode hn, hp, hq; hn = (HashNode) nodeptr; hn->nam = nam; hashval = ht->hash(hn->nam) % ht->hsize; hp = ht->nodes[hashval]; /* check if this is the first node for this hash value */ if (!hp) { hn->next = NULL; ht->nodes[hashval] = hn; if (++ht->ct == ht->hsize * 2) expandhashtable(ht); return; } /* else check if the first node contains the same key */ if (!strcmp(hp->nam, hn->nam)) { hn->next = hp->next; ht->nodes[hashval] = hn; ht->freenode(hp); return; } /* else run through the list and check all the keys */ hq = hp; hp = hp->next; for (; hp; hq = hp, hp = hp->next) { if (!strcmp(hp->nam, hn->nam)) { hn->next = hp->next; hq->next = hn; ht->freenode(hp); return; } } /* else just add it at the front of the list */ hn->next = ht->nodes[hashval]; ht->nodes[hashval] = hn; if (++ht->ct == ht->hsize * 2) expandhashtable(ht); }