首先介绍一下什么是哈希表。同线性表、树一样,哈希表也是一种数据结构,理想情况下可以不需要任何比较,一次存取便能得到所查记录。所以它的优点就是查找特定记录的速度快。因为哈希表是基于数组的,所以创建后就难于扩展,而且不利于遍历数据。
下面是哈希表的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 ",hashtable->value[1]->data); 105 if(hashtable->value[2]==NULL) printf("hashtable 2 is null "); 106 printf("hashtable 1 : %d ",node1->data); 107 printf("hashtable 1 : %d ",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 "); 111 else printf("hashtable 1 : %d ",node3->data); 112 113 114 }
参考来自:http://blog.csdn.net/feixiaoxing/article/details/6885657