C语言实现哈希表(key为字符型)
2013-06-25 17:08
211 查看
简单实现了哈希表的插入和查找功能,简要说明如下:
1、数据结构:
struct HashNode
{
char* sKey; //键
int nValue; //值
HashNode* pNext; //当Hash值冲突时,指向HASH值相同的下一个节点。
}
HashNode* hashTable[HASH_TABLE_MAX_SIZE]; //哈希表的数组
int hash_table_size; //哈希表中元素的个数
2、函数:
void hash_table_init() 初始化哈希表
void hash_table_insert(const char* skey, int nvalue) 向哈希表中插入键位skey,值为nvalue的键值对。
当skey已经在哈希表中时,忽略该键值对。
void hash_table_remove(const char* skey) 从哈希表中删除键值对。
HashNode* hash_table_lookup(const char* skey) 查找键值为skey的节点。当找到时,返回对应的HashNode指针,
没有找到时,返回NULL。
void hash_table_release() 释放哈希表的内存空间。
C语言实现的哈希表(HashTable)源码如下:
1、数据结构:
struct HashNode
{
char* sKey; //键
int nValue; //值
HashNode* pNext; //当Hash值冲突时,指向HASH值相同的下一个节点。
}
HashNode* hashTable[HASH_TABLE_MAX_SIZE]; //哈希表的数组
int hash_table_size; //哈希表中元素的个数
2、函数:
void hash_table_init() 初始化哈希表
void hash_table_insert(const char* skey, int nvalue) 向哈希表中插入键位skey,值为nvalue的键值对。
当skey已经在哈希表中时,忽略该键值对。
void hash_table_remove(const char* skey) 从哈希表中删除键值对。
HashNode* hash_table_lookup(const char* skey) 查找键值为skey的节点。当找到时,返回对应的HashNode指针,
没有找到时,返回NULL。
void hash_table_release() 释放哈希表的内存空间。
C语言实现的哈希表(HashTable)源码如下:
/* * Author: puresky * Date: 2011/01/08 * Purpose: a simple implementation of HashTable in C */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> /*=================hash table start=========================================*/ #define HASH_TABLE_MAX_SIZE 10000 typedef struct HashNode_Struct HashNode; struct HashNode_Struct { char* sKey; int nValue; HashNode* pNext; }; HashNode* hashTable[HASH_TABLE_MAX_SIZE]; //hash table data strcutrue int hash_table_size; //the number of key-value pairs in the hash table! //initialize hash table void hash_table_init() { hash_table_size = 0; memset(hashTable, 0, sizeof(HashNode*) * HASH_TABLE_MAX_SIZE); } //string hash function unsigned int hash_table_hash_str(const char* skey) { const signed char *p = (const signed char*)skey; unsigned int h = *p; if(h) { for(p += 1; *p != '\0'; ++p) h = (h << 5) - h + *p; } return h; } //insert key-value into hash table void hash_table_insert(const char* skey, int nvalue) { if(hash_table_size >= HASH_TABLE_MAX_SIZE) { printf("out of hash table memory!\n"); return; } unsigned int pos = hash_table_hash_str(skey) % HASH_TABLE_MAX_SIZE; HashNode* pHead = hashTable[pos]; while(pHead) { if(strcmp(pHead->sKey, skey) == 0) { printf("%s already exists!\n", skey); return ; } pHead = pHead->pNext; } HashNode* pNewNode = (HashNode*)malloc(sizeof(HashNode)); memset(pNewNode, 0, sizeof(HashNode)); pNewNode->sKey = (char*)malloc(sizeof(char) * (strlen(skey) + 1)); strcpy(pNewNode->sKey, skey); pNewNode->nValue = nvalue; pNewNode->pNext = hashTable[pos]; hashTable[pos] = pNewNode; hash_table_size++; } //remove key-value frome the hash table void hash_table_remove(const char* skey) { unsigned int pos = hash_table_hash_str(skey) % HASH_TABLE_MAX_SIZE; if(hashTable[pos]) { HashNode* pHead = hashTable[pos]; HashNode* pLast = NULL; HashNode* pRemove = NULL; while(pHead) { if(strcmp(skey, pHead->sKey) == 0) { pRemove = pHead; break; } pLast = pHead; pHead = pHead->pNext; } if(pRemove) { if(pLast) pLast->pNext = pRemove->pNext; else hashTable[pos] = NULL; free(pRemove->sKey); free(pRemove); } } } //lookup a key in the hash table HashNode* hash_table_lookup(const char* skey) { unsigned int pos = hash_table_hash_str(skey) % HASH_TABLE_MAX_SIZE; if(hashTable[pos]) { HashNode* pHead = hashTable[pos]; while(pHead) { if(strcmp(skey, pHead->sKey) == 0) return pHead; pHead = pHead->pNext; } } return NULL; } //print the content in the hash table void hash_table_print() { printf("===========content of hash table=================\n"); int i; for(i = 0; i < HASH_TABLE_MAX_SIZE; ++i) if(hashTable[i]) { HashNode* pHead = hashTable[i]; printf("%d=>", i); while(pHead) { printf("%s:%d ", pHead->sKey, pHead->nValue); pHead = pHead->pNext; } printf("\n"); } } //free the memory of the hash table void hash_table_release() { int i; for(i = 0; i < HASH_TABLE_MAX_SIZE; ++i) { if(hashTable[i]) { HashNode* pHead = hashTable[i]; while(pHead) { HashNode* pTemp = pHead; pHead = pHead->pNext; if(pTemp) { free(pTemp->sKey); free(pTemp); } } } } } /* ===============================hash table end=========================*/ /* ============================test function ============================*/ #define MAX_STR_LEN 20 #define MIN_STR_LEN 10 void rand_str(char r[]) { int i; int len = MIN_STR_LEN + rand() % (MAX_STR_LEN - MIN_STR_LEN); for(i = 0; i < len - 1; ++i) r[i] = 'a' + rand() % ( 'z' - 'a'); r[len - 1] = '\0'; } int main(int argc, char** argv) { srand(time(NULL)); hash_table_init(); printf("insert testing.........\n"); int n = 10; const char *key1 = "aaammd"; const char *key2 = "xzzyym"; const char *key3 = "cdcded"; hash_table_insert(key1, 110); hash_table_insert(key2, 220); hash_table_insert(key3, 330); char str[MAX_STR_LEN + 1]; while(n--) { rand_str(str); hash_table_insert(str, n); } hash_table_print(); printf("\nlookup testing..........\n"); HashNode* pNode = hash_table_lookup(key1); printf("lookup result:%d\n", pNode->nValue); pNode = hash_table_lookup(key2); printf("lookup result:%d\n", pNode->nValue); printf("\nremove testing..........\n"); printf("before remove %s:\n", key3); hash_table_print(); hash_table_remove(key3); printf("after remove:\n"); hash_table_print(); hash_table_release(); system("pause"); return 0; }
相关文章推荐
- C语言实现哈希表(key为字符型)
- C语言实现哈希表(key为整形变量)
- c语言实现带LRU机制的哈希表
- C/C++拾遗(二)C语言实现Key-Value键值对查找
- 哈希表的C语言实现
- c语言实现最简单的哈希表(开放地址线性探测法)
- c语言实现数据结构中的哈希表
- 哈希表例子(C语言实现)
- C语言实现哈希表查找算法
- C语言实现 二分查找数组中的Key值(递归和非递归)
- 模拟实现英汉字典(使用key/value形式的哈希表)
- 简单的哈希表实现 C语言
- 哈希表的C语言实现
- C语言实现哈希表
- 哈希表系列:初探哈希,c语言实现
- C语言基于哈希表实现通讯录
- 《数据结构》中的哈希表实现的例子(C语言)
- 哈希表的一个C语言实现
- C语言实现数据结构之哈希表
- C语言实现哈希表HashTable及迅雷面试题哈希表桶结构代码