链地址的哈希表实现
1.类型定义
1 typedef struct Node { 2 RcdType r; 3 struct Node *next; 4 } Node; 5 typedef struct { 6 Node **rcd; 7 int size; // 哈希表容量 8 int count; // 当前表中含有的记录个数 9 int (*hash)(KeyType key, int); // 函数指针变量,用于选取的哈希函数 10 } HashTable;
2.初始化
1 Status InitHash(HashTable &H, int size, int (*hash)(KeyType,int)) { 2 //初始化哈希表 3 int i; 4 if(NULL==(H.rcd=(Node**)malloc(sizeof(Node)*size))) return OVERFLOW; 5 for(i = 0;i<size;i++) 6 H.size = size; 7 H.count = 0; 8 H.hash = hash; 9 return OK; 10 }
3.查找
1 Node* SearchHash(HashTable &H, int key){ 2 int p = H.hash(key,H.size); 3 Node *np; 4 for(np = H.rcd[p];np!=NULL;np=np->next){ 5 if(np->r.key = key) return np; 6 } 7 return NULL; 8 } 9 10 11 //哈希函数 12 int hash(int key, int size) { 13 return 3*key%size; 14 } 15
4.插入
1 Status InsertHash(HashTable &H, RcdType e){ 2 int p; 3 Node *np; 4 if((np=SearchHash(H, e.key))==NULL){ 5 p = H.hash(e.key, H.size); 6 np = (Node*)malloc(sizeof(Node)); 7 if(np==NULL) return OVERFLOW; 8 np->r = e; 9 np->next = H.rcd[p]; 10 H.rcd[p]= np; 11 H.count++; 12 return OK; 13 } 14 return error; 15 }