哈希表的C语言实现

  首先介绍一下什么是哈希表。同线性表、树一样,哈希表也是一种数据结构,理想情况下可以不需要任何比较,一次存取便能得到所查记录。所以它的优点就是查找特定记录的速度快。因为哈希表是基于数组的,所以创建后就难于扩展,而且不利于遍历数据。

  下面是哈希表的C实现:

  1 /* 哈希表的C实现
  2   查找使用的方法是“除留余数法”,解决冲突使用的方法是“链地址法”。
  3 */
  4 #include<stdio.h>
  5 #include<malloc.h> //malloc 
  6 #include<string.h> //memset
  7 #define FALSE 0
  8 #define TRUE 1
  9 typedef int STATUS;
 10 //定义哈希表和基本数据节点
 11 typedef struct _NODE
 12 {
 13     int data;
 14     struct _NODE* next;
 15 }NODE;
 16 
 17 typedef struct _HASH_TABLE
 18 {
 19     NODE* value[10];
 20 }HASH_TABLE;
 21 //创建哈希表
 22 HASH_TABLE* create_hash_table()
 23 {
 24     HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
 25     memset(pHashTbl, 0, sizeof(HASH_TABLE));
 26     return pHashTbl;
 27 }
 28 //在哈希表中查找数据
 29 NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
 30 {
 31     NODE* pNode;
 32     if(NULL ==  pHashTbl)
 33         return NULL;
 34 
 35     if(NULL == (pNode = pHashTbl->value[data % 10]))
 36         return NULL;
 37 
 38     while(pNode){
 39         if(data == pNode->data)
 40             return pNode;
 41         pNode = pNode->next;
 42     }
 43     return NULL;
 44 }
 45 //在哈希表中插入数据
 46 STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
 47 {
 48     NODE* pNode;
 49     if(NULL == pHashTbl)
 50         return FALSE;
 51 
 52     if(NULL == pHashTbl->value[data % 10]){
 53         pNode = (NODE*)malloc(sizeof(NODE));
 54         memset(pNode, 0, sizeof(NODE));
 55         pNode->data = data;
 56         pHashTbl->value[data % 10] = pNode;
 57         return TRUE;
 58     }
 59 
 60     if(NULL != find_data_in_hash(pHashTbl, data))
 61         return FALSE;
 62 
 63     pNode = pHashTbl->value[data % 10];
 64     while(NULL != pNode->next)
 65         pNode = pNode->next;
 66 
 67     pNode->next = (NODE*)malloc(sizeof(NODE));
 68     memset(pNode->next, 0, sizeof(NODE));
 69     pNode->next->data = data;
 70     return TRUE;
 71 }
 72 //从哈希表中删除数据
 73 STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
 74 {
 75     NODE* pHead;
 76     NODE* pNode;
 77     if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
 78         return FALSE;
 79 
 80     if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
 81         return FALSE;
 82 
 83     if(pNode == pHashTbl->value[data % 10]){
 84         pHashTbl->value[data % 10] = pNode->next;
 85         free(pNode);
 86         return TRUE;
 87     }
 88 
 89     pHead = pHashTbl->value[data % 10];
 90     while(pNode != pHead ->next)
 91         pHead = pHead->next;
 92     pHead->next = pNode->next;
 93 
 94 }
 95  void main()
 96 {
 97     HASH_TABLE* hashtable=create_hash_table();
 98     insert_data_into_hash(hashtable,1);
 99     //insert_data_into_hash(hashtable,4);
100     insert_data_into_hash(hashtable,11);
101     insert_data_into_hash(hashtable,21);
102     NODE* node1=find_data_in_hash(hashtable,11);
103     NODE* node2=find_data_in_hash(hashtable,21);
104     printf("hashtable 1 : %d \n",hashtable->value[1]->data);
105     if(hashtable->value[2]==NULL) printf("hashtable 2 is null\n");
106     printf("hashtable 1 : %d \n",node1->data);
107     printf("hashtable 1 : %d \n",node2->data);
108     delete_data_from_hash(hashtable,21);
109         NODE* node3=find_data_in_hash(hashtable,21);
110     if(node3==NULL) printf("21 is cancel\n");
111     else printf("hashtable 1 : %d \n",node3->data);
112     
113 
114 }

  参考来自:http://blog.csdn.net/feixiaoxing/article/details/6885657

posted @ 2013-12-02 22:11  lvsj  阅读(6890)  评论(1编辑  收藏  举报