哈希表

  1. /** 
  2.  * 哈希表槽的数据结构 
  3.  */  
  4. typedef struct Bucket {  
  5.     char *key;  
  6.     void *value;  
  7.     struct Bucket *next;  
  8. } Bucket;  
  9.   
  10. /** 
  11.  * 哈希表数据结构 
  12.  */  
  13. typedef struct HashTable {  
  14.     int size;   // 哈希表大小  
  15.     int elem_num;   // 哈希表已经保存的数据元素个数  
  16.     Bucket **buckets;  
  17. } HashTable;  
  18.   
  19. int hashIndex(HashTable *ht, char *key);  
  20. int hashInit(HashTable *ht);  
  21. int hashLookup(HashTable *ht, char *key, void **result);  
  22. int hashInsert(HashTable *ht, char *key, void *value);  
  23. int hashRemove(HashTable *ht, char *key);  
  24. int hashDestory(HashTable *ht);  
  25. #endif 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include "hash.h"  
  5.   
  6. /** 
  7.  * 初始化哈希表 
  8.  * 
  9.  * T = O(1) 
  10.  * 
  11.  */  
  12. int hashInit(HashTable *ht)  
  13. {  
  14.     ht->size = HASH_TABLE_INIT_SIZE;  
  15.     ht->elem_num = 0;  
  16.     ht->buckets = (Bucket **)calloc(ht->size, sizeof(Bucket *));  
  17.   
  18.     if (ht->buckets == NULL)  
  19.         return FAILED;  
  20.     else  
  21.         return SUCCESS;  
  22. }  
  23.   
  24. /** 
  25.  * 散列函数 
  26.  * 
  27.  * T = O(n) 
  28.  * 
  29.  */  
  30. int hashIndex(HashTable *ht, char *key)  
  31. {  
  32.     int hash = 0;  
  33.   
  34.     while (*key != '\0') {  
  35.         hash += (int)*key;  
  36.         key ++;  
  37.     }  
  38.   
  39.     return hash % ht->size;  
  40. }  
  41.   
  42. /** 
  43.  * 哈希查找函数 
  44.  * 
  45.  * T = O(n) 
  46.  * 
  47.  */  
  48. int hashLookup(HashTable *ht, char *key, void **result)  
  49. {  
  50.     int index = hashIndex(ht, key);  
  51.   
  52.     Bucket *bucket = ht->buckets[index];  
  53.   
  54.     while (bucket) {  
  55.         if (strcmp(bucket->key, key) == 0) {  
  56.             *result = bucket->value;  
  57.             return SUCCESS;  
  58.         }  
  59.         bucket = bucket->next;  
  60.     }  
  61.   
  62.     return FAILED;  
  63. }  
  64.   
  65.   
  66. /** 
  67.  * 哈希表插入操作 
  68.  * 
  69.  * T = O(1) 
  70.  * 
  71.  */  
  72. int hashInsert(HashTable *ht, char *key, void *value)  
  73. {  
  74.     int index = hashIndex(ht, key);  
  75.   
  76.     Bucket *org_bucket, *tmp_bucket;  
  77.     org_bucket = tmp_bucket = ht->buckets[index];  
  78.   
  79.     // 检查key是否已经存在于hash表中  
  80.     while (tmp_bucket) {  
  81.         if (strcmp(tmp_bucket->key, key) == 0) {  
  82.             tmp_bucket->value = value;  
  83.             return SUCCESS;  
  84.         }  
  85.         tmp_bucket = tmp_bucket->next;  
  86.     }  
  87.   
  88.     Bucket *new = (Bucket *)malloc(sizeof(Bucket));  
  89.       
  90.     if (new == NULL)    return FAILED;  
  91.   
  92.     new->key = key;  
  93.     new->value = value;  
  94.     new->next = NULL;  
  95.   
  96.     ht->elem_num += 1;  
  97.   
  98.     // 头插法  
  99.     if (org_bucket) {  
  100.         new->next = org_bucket;  
  101.     }  
  102.   
  103.     ht->buckets[index] = new;  
  104.   
  105.     return SUCCESS;   
  106. }  
  107.   
  108. /** 
  109.  * 哈希删除函数 
  110.  * 
  111.  * T = O(n) 
  112.  * 
  113.  */  
  114. int hashRemove(HashTable *ht, char *key)  
  115. {  
  116.     int index = hashIndex(ht, key);  
  117.   
  118.     Bucket *pre, *cur, *post;  
  119.   
  120.     pre = NULL;  
  121.     cur = ht->buckets[index];  
  122.   
  123.     while (cur) {  
  124.         if (strcmp(cur->key, key) == 0) {  
  125.             post = cur->next;  
  126.               
  127.             if (pre == NULL) {  
  128.                 ht->buckets[index] = post;  
  129.             } else {  
  130.                 pre->next = post;  
  131.             }  
  132.   
  133.             free(cur);  
  134.   
  135.             return SUCCESS;  
  136.         }  
  137.   
  138.         pre = cur;  
  139.         cur = cur->next;  
  140.     }  
  141.   
  142.     return FAILED;  
  143. }  
  144.   
  145. /** 
  146.  * 哈希表销毁函数 
  147.  * 
  148.  * T = O(n) 
  149.  */  
  150. int hashDestory(HashTable *ht)  
  151. {  
  152.     int i;  
  153.     Bucket *cur, *tmp;  
  154.   
  155.     cur = tmp = NULL;  
  156.   
  157.     for (i = 0; i < ht->size; i ++) {  
  158.         cur = ht->buckets[i];  
  159.   
  160.         while (cur) {  
  161.             tmp = cur->next;  
  162.             free(cur);  
  163.             cur = tmp;  
  164.         }  
  165.     }  
  166.   
  167.     free(ht->buckets);  
  168.   
  169.     return SUCCESS;  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值