void InitHashHashTable HT for i=0; i HTMax; i++ HTi φ; 插入算法 void InsertHash HashTable HT ElemType x i Hash xkey ; if HTikey = φ HTi x; else if HTikey ≠ φ i i + 1 mod HTMax; HTMax
上述算法是哈希表的基本操作,包括初始化哈希表、插入元素和查找元素。
初始化哈希表的函数将哈希表的每个元素都置为φ(空)。
插入元素的函数先通过哈希函数计算元素的哈希值,如果该位置为空,则直接将元素插入。如果该位置已经有元素,则通过线性探测(向后依次查找)找到空位置插入元素。
查找元素的函数先通过哈希函数计算元素的哈希值,如果该位置有元素且与目标元素的键值相同,则返回1(找到)。如果该位置为空,则返回0(未找到)。如果该位置不为空但元素的键值与目标元素的键值不同,则通过线性探测找到相同的键值或空位置,然后判断是否找到目标元素。
完整主函数程序源代码如下:
#include <stdio.h> #define HTMax 100 // 哈希表长度
typedef struct { int key; // 键值 // 其他数据项 } ElemType;
typedef struct { ElemType data; } HashTable;
int Hash(int key) { // 哈希函数 return key % HTMax; }
void InitHash(HashTable HT[]) { int i; for (i=0; i<HTMax; i++) HT[i].data.key = 0; // 空标记为0 }
void InsertHash(HashTable HT[], ElemType x) { int i = Hash(x.key); if (HT[i].data.key == 0) HT[i].data = x; else if (HT[i].data.key != 0) { i = (i + 1) % HTMax; while (HT[i].data.key != 0) i = (i + 1) % HTMax; HT[i].data = x; } }
int SearchHash(HashTable HT[], int key) { int i = Hash(key); if (HT[i].data.key == key) return 1; else if (HT[i].data.key != 0) { i = (i + 1) % HTMax; while (HT[i].data.key != key && HT[i].data.key != 0) i = (i + 1) % HTMax; if (HT[i].data.key == key) return 1; else return 0; } else return 0; }
int main() { HashTable HT[HTMax]; InitHash(HT); ElemType x; x.key = 123; InsertHash(HT, x); printf("%d\n", SearchHash(HT, 123)); printf("%d\n", SearchHash(HT, 456)); return 0;
原文地址: https://www.cveoy.top/t/topic/eJVC 著作权归作者所有。请勿转载和采集!