#include "HashTable.h" #include "bool.h" template KEY HashEntry::getKey(void) { return _key; } template DATA HashEntry::getData(void) { return _data; } template HashEntry * HashEntry::getNext(void) { return _next; } template HashTable::HashTable(int size, int (*hash_fn)(KEY), int (*key_eq)(KEY,KEY)) { _numElts = 0; _size = size; _hashFn = hash_fn; _eqFn = key_eq; _table = new HashEntry *[_size]; for (int i = 0; i < _size; i++) _table[i] = NULL; } template HashTable::~HashTable() { HashEntry *trav, *next; for (int i = 0; i < _size; i++) { _trav = _table[i]; while(_trav) { _next = trav->_next; delete trav; trav = next; } } delete [] _table; } template int HashTable::size(void) { return _size; } template int HashTable::numElements(void) { return _numElts; } template int HashTable::find(KEY key, DATA *data) { HashEntry *trav; trav = _table[_hashFn(key) % _size]; while ((trav != NULL) && !_eqFn(key, trav->_key)) trav = trav->_next; if (trav == NULL) return FALSE; else { if (data) *data = trav->_data; return TRUE; } } template HashEntry * HashTable::getBucket(KEY key) { return _table[_hashFn(key) % _size]; } template void HashTable::insert(KEY key, DATA data) { int hash_val = _hashFn(key) % _size; HashEntry *entry = new HashEntry; entry->_key = key; entry->_data = data; entry->_next = _table[hash_val]; _table[hash_val] = entry; _numElts++; }