哈希算法(闭散列)
模塊代碼函數
【1.定義一個哈希算法結構體】
完整代碼塊
/***************************************/ //Hash.h#define MAX_SIZE 10typedef int DataType;typedef enum{EXIST, EMPTY, DELETE}State;typedef struct HTElem {DataType _data;State _state; }HTElem;typedef struct HashTable {HTElem _array[MAX_SIZE];int _total;//哈希表中元素的個數int _size;//計算哈希表中有效元素的個數 }HashTable, HT;//哈希表的初始化 void InitHashTable(HT *ht);//哈希表的插入 void InsertHashTable(HT *ht, DataType data);//哈希表的刪除 void DeleteHashTable(HT *ht, DataType data);//哈希表的查找 int FindHashTable(HT *ht, DataType data);//計算哈希表長度 int SizeHashTable(HT *ht);//哈希表的判空 int EmptyHashTable(HT *ht);//計算哈希地址 int FuncHash(DataType data);/***************************************/ //Hash.c #include <assert.h>//哈希表的初始化 void InitHashTable(HT *ht) {assert(ht);int i = 0;for (; i < MAX_SIZE; ++i)ht->_array[i]._state = EMPTY;ht->_size = 0;ht->_total = 0; }//哈希表的插入 void InsertHashTable(HT *ht, DataType data) {int hashAddr;int i = 0;assert(ht);if (ht->_total == MAX_SIZE)//說明哈希表元素已滿return;//計算哈希地址hashAddr = FuncHash(data);while (EMPTY != ht->_array[hashAddr]._state){if (EXIST == ht->_array[hashAddr]._state){if (data == ht->_array[hashAddr]._data)return;} #if 0hashAddr++;if (hashAddr == MAX_SIZE)//越界了,從頭開始訪問hashAddr = 0; #else//二次探測i++;hashAddr = hashAddr + 2 * i + 1;if (hashAddr >= MAX_SIZE)hashAddr %= MAX_SIZE; #endif}//插入元素ht->_array[hashAddr]._data = data;ht->_array[hashAddr]._state = EXIST;ht->_size++;ht->_total++; }//哈希表的刪除 void DeleteHashTable(HT *ht, DataType data) {assert(ht);if (-1 != FindHashTable(ht, data)){ht->_array[FindHashTable(ht, data)]._state = DELETE;ht->_size--;} }//哈希表的查找 int FindHashTable(HT *ht, DataType data) {int hashAddr;int i=0;assert(ht);hashAddr = FuncHash(data);while (EMPTY != ht->_array[hashAddr]._state){if (EXIST == ht->_array[hashAddr]._state){if (data == ht->_array[hashAddr]._data)return hashAddr;}#if 0hashAddr++;if (hashAddr == MAX_SIZE)//越界了,從頭開始訪問hashAddr = 0; #else//二次探測i++hashAddr = hashAddr + 2 * i + 1;if (hashAddr >= MAX_SIZE)hashAddr %= MAX_SIZE; #endif}return -1; }//計算哈希表長度 int SizeHashTable(HT *ht) {assert(ht);return ht->_size; }//哈希表的判空 int EmptyHashTable(HT *ht) {assert(ht);return 0 == ht->_size; }//計算哈希地址 int FuncHash(DataType data) {return data%MAX_SIZE; }/***************************************/ //test.c #include"Hash.h" #include <stdio.h>void TestHash() {HashTable ht;InitHashTable(&ht);InsertHashTable(&ht, 23);InsertHashTable(&ht, 14);InsertHashTable(&ht, 35);InsertHashTable(&ht, 22);InsertHashTable(&ht, 27);InsertHashTable(&ht, 17);printf("size = %d\n", SizeHashTable(&ht));if (-1 == FindHashTable(&ht, 17))printf("17 這個元素不存在\n");elseprintf("17 這個元素存在\n");if (-1 == FindHashTable(&ht, 37))printf("37 這個元素不存在\n");elseprintf("37 這個元素存在\n"); }int main() {TestHash();system("pause");return 0; }結果輸出:
總結
- 上一篇: 如何编译typescript文件,在控制
- 下一篇: GoldenDict词典配置