HashTable* hTable = NULL; if (TableSize <= 0) { TableSize = DEFAULT_SIZE; } hTable = new HashTable; hTable->TableSize = TableSize; hTable->ThisList = new List[TableSize];//哈希桶 if (!hTable->ThisList) { returnNULL; } //为Hash桶的对应指针数组初始化链表结点 for (int i = 0; i < TableSize; i++) { hTable->ThisList[i] = new ListNode; if (!hTable->ThisList[i]) { returnNULL; } else { memset(hTable->ThisList[i], 0, sizeof(ListNode)); } }
return hTable; }
//哈希表中查找元素 Element findHash(HashTable* hashtable, int key) { int i = 0; List L = NULL; Element e = NULL; i = Hash(key, hashtable->TableSize); L = hashtable->ThisList[i]; e = L->next; while (e && e->key != key) { e = e->next; } return e; }
//哈希表插入元素 voidinsertHash(HashTable* hashtable, int key, void* value) { Element e = NULL, tmp = NULL; List L = NULL; e = findHash(hashtable, key);
if (!e) { tmp = new ListNode; if (!tmp) { return; } L = hashtable->ThisList[Hash(key, hashtable->TableSize)];//前插法 tmp->data = value; tmp->key = key; tmp->next = L->next; L->next = tmp; } else { cout << "这个键已经存在" << endl; } }
//哈希表删除元素 voidDeleteHash(HashTable* hashtable, int key) { Element e = NULL, last = NULL; List L = NULL; int i = Hash(key, hashtable->TableSize); L = hashtable->ThisList[i]; last = L; e = L->next; //key是所对应数据的数字代号,这个每个元素是不同的,i是对应数据所在的hash桶,也就是key % tablesize,多个元素可以是同一个 while (e && e->key != key) { last = e; e = e->next; } if (e) { last->next = e->next; delete e; } else { cout << "该key不存在" << endl; } }
HashTable* hTable = NULL; if (TableSize <= 0) { TableSize = BUCKET_SIZE; } hTable = new HashTable; hTable->TableSize = TableSize; hTable->ThisList = new List[TableSize];//哈希桶 if (!hTable->ThisList) { returnNULL; }
//为Hash桶的对应指针数组初始化链表结点 for (int i = 0; i < TableSize; i++) { hTable->ThisList[i] = new ListNode; if (!hTable->ThisList[i]) { returnNULL; } else { memset(hTable->ThisList[i], 0, sizeof(ListNode)); } }
return hTable; }
//哈希表中查找元素 Element findHash(HashTable* hashtable, void* key) { int i = 0; List L = NULL; Element e = NULL;
i = Hash(key, hashtable->TableSize);//将这个字符串类型的key转化为哈希桶索引,找到该元素要放置的桶
L = hashtable->ThisList[i];//对应的哈希桶
e = L->next;
while (e && compare(e->key, key) != 0) { e = e->next; } return e; }
/* 不要被类型限制了,本质上和key是int类型的哈希表是一样的。 */
//哈希表插入元素 voidinsertHash(HashTable* hashtable, void* key, void* value) { Element e = NULL, tmp = NULL; List L = NULL; e = findHash(hashtable, key);
if (!e) { tmp = new ListNode; if (!tmp) { return; } //L为其对应位置的哈希桶 //将新插入的结点与桶链接起来 L = hashtable->ThisList[Hash(key, hashtable->TableSize)];//前插法 tmp->data = value; tmp->key = key; tmp->next = L->next; L->next = tmp; } else { cout << "这个键已经存在" << endl; } }
//哈希表删除元素 voidDeleteHash(HashTable* hashtable, void* key) { Element e = NULL, last = NULL; List L = NULL; int i = Hash(key, hashtable->TableSize);//找到对应的哈希桶,然后在对应的哈希桶里面一个一个地遍历 L = hashtable->ThisList[i]; last = L; e = L->next; //key是所对应数据的数字代号,这个每个元素是不同的,i是对应数据所在的hash桶,也就是key % tablesize,多个元素可以是同一个 while (e && !compare(e->key, key)) { last = e; e = e->next; } if (e) { last->next = e->next; delete e; } else { cout << "该key不存在" << endl; } }
//销毁哈希表 voiddestoryHash(HashTable* hashtable) { List L = NULL; Element cur = NULL, next = NULL; for (int i = 0; i < hashtable->TableSize; i++) { L = hashtable->ThisList[i]; cur = L->next; while (cur) { next = cur->next; delete cur; cur = next; }