设为首页 加入收藏

TOP

hashmap C语言实现(一)
2014-11-23 23:55:08 来源: 作者: 【 】 浏览:62
Tags:hashmap 语言 实现

源代码(适合Linux和Windows)包括:
hashmap.c
hashmap.h
MSVC测试文件:
main.c
下面是源代码,最初来自github,我改写了几个地方,并重写了全部测试代码.没有内存泄露,请放心使用.
[cpp]
/**
* hashmap.h
*/
#ifndef _HASHMAP_H_INCLUDED
#define _HASHMAP_H_INCLUDED

#define HMAP_E_OUTMEM (-4) /* Out of Memory */
#define HMAP_E_NOTFOUND (-3) /* No such element */
#define HMAP_E_OVERFLOW (-2) /* Hashmap is full */
#define HMAP_E_FAIL (-1) /* Hashmap api fail */
#define HMAP_S_OK (0) /* Success */

/**
* void_ptr is a pointer. This allows you to put arbitrary structures in the hashmap.
*/
typedef void* void_ptr;

/**
* hmap_t is a pointer to an internally maintained data structure.
* Clients of this package do not need to know how hashmaps are
* represented. They see and manipulate only hmap_t's.
*/
typedef void_ptr hmap_t;

/**
* hmap_callback_func is a pointer to a function that can take two void_ptr arguments
* and return an integer. Returns status code..
*/
typedef int (*hmap_callback_func)(void_ptr, void_ptr);

/**
* Return an empty hashmap. Returns NULL if empty.
*/
extern hmap_t hashmap_create();

/**
* Iteratively call fn with argument (value, arg) for each element data
* in the hashmap. The function returns anything other than HMAP_S_OK
* the traversal is terminated. fn must not modify any hashmap functions.
*/
extern int hashmap_iterate(hmap_t in, hmap_callback_func fnIterValue, void_ptr arg);

/**
* Add an element to the hashmap. Return HMAP_S_OK or HMAP_E_OUTMEM.
*/
extern int hashmap_put(hmap_t in, char* key, void_ptr elem);

/**
* Get an element from the hashmap. Return HMAP_S_OK or HMAP_E_NOTFOUND.
*/
extern int hashmap_get(hmap_t in, char* key, void_ptr *elem);

/**
* Remove an element from the hashmap. Return HMAP_S_OK or HMAP_E_NOTFOUND.
*/
extern int hashmap_remove(hmap_t in, char* key, void_ptr *outValue);

/**
* Free the hashmap
*/
extern void hashmap_destroy(hmap_t in, hmap_callback_func fnFreeva lue, void_ptr arg);

/**
* Get the current size of a hashmap
*/
extern int hashmap_size(hmap_t in);

#endif /* _HASHMAP_H_INCLUDED */

[cpp] view plaincopyprint
/**
* hashmap.c
* Generic hash map implementation.
*/
#include "hashmap.h"

#include
#include
#include

#define HMAP_INITIAL_SIZE (256)
#define HMAP_CHAIN_LENGTH (8)

typedef enum _use_state {
unused_0 = 0,
used_1 = 1
} use_state;

/* A element to keep keys and values */
typedef struct _hashmap_elem_t{
char *key; /* pointer to actual key storage */
use_state used; /* unused_0, used_1 */
void_ptr data; /* pointer to value memory allocated by callee */
} hashmap_elem_t;

/* A hashmap has maximum size and current size, as well as the elems to hold */
typedef struct _hashmap_map_t{
int table_size;
int size;
hashmap_elem_t *elems;
} hashmap_map_t;

/**
* The implementation here was originally done by Gary S. Brown.
* I have borrowed the tables directly, and made some minor changes.
*
* COPYRIGHT (C) 1986 Gary S. Brown.
* You may use this program, or code or tables extracted from it,
* as desired without restriction.
*/
static unsigned long crc32_tab[] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇sqrt函数分析 下一篇c语言的头文件#include <limit..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: