链地址的哈希表实现

链地址的哈希表实现

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 }

 

 

 

 

posted @ 2017-10-12 12:59  im.lhc  阅读(323)  评论(0编辑  收藏  举报