htop源码中的Hashtable
2014-04-03 17:50
357 查看
这里的Hashtable其实是hashmap,实现的是int型到void*的映射。
Hashtable结构的简单演示如下图:
代码片段如下:
htop源码获取:http://download.csdn.net/detail/u014495327/7142007
Hashtable结构的简单演示如下图:
代码片段如下:
typedef struct HashtableItem { unsigned int key; void* value; struct HashtableItem* next; } HashtableItem; typedef struct Hashtable_ { int size; HashtableItem** buckets; int items; bool owner; }Hashtable; static HashtableItem* HashtableItem_new(unsigned int key, void* value) { HashtableItem* this; this = (HashtableItem*) malloc(sizeof(HashtableItem)); this->key = key; this->value = value; this->next = NULL; return this; } Hashtable* Hashtable_new(int size, bool owner) { Hashtable* this; this = (Hashtable*) malloc(sizeof(Hashtable)); this->items = 0; this->size = size; this->buckets = (HashtableItem**) calloc(sizeof(HashtableItem*), size); this->owner = owner; assert(Hashtable_isConsistent(this)); return this; } void Hashtable_delete(Hashtable* this) { assert(Hashtable_isConsistent(this)); for (int i = 0; i < this->size; i++) { HashtableItem* walk = this->buckets[i]; while (walk != NULL) { if (this->owner) free(walk->value); HashtableItem* savedWalk = walk; walk = savedWalk->next; free(savedWalk); } } free(this->buckets); free(this); } void Hashtable_put(Hashtable* this, unsigned int key, void* value) { unsigned int index = key % this->size; HashtableItem** bucketPtr = &(this->buckets[index]); while (true) if (*bucketPtr == NULL) { *bucketPtr = HashtableItem_new(key, value); this->items++; break; } else if ((*bucketPtr)->key == key) { if (this->owner) free((*bucketPtr)->value); (*bucketPtr)->value = value; break; } else bucketPtr = &((*bucketPtr)->next); assert(Hashtable_isConsistent(this)); } void* Hashtable_remove(Hashtable* this, unsigned int key) { unsigned int index = key % this->size; assert(Hashtable_isConsistent(this)); HashtableItem** bucket; for (bucket = &(this->buckets[index]); *bucket; bucket = &((*bucket)->next) ) { if ((*bucket)->key == key) { void* value = (*bucket)->value; HashtableItem* next = (*bucket)->next; free(*bucket); (*bucket) = next; this->items--; if (this->owner) { free(value); assert(Hashtable_isConsistent(this)); return NULL; } else { assert(Hashtable_isConsistent(this)); return value; } } } assert(Hashtable_isConsistent(this)); return NULL; } inline void* Hashtable_get(Hashtable* this, unsigned int key) { unsigned int index = key % this->size; HashtableItem* bucketPtr = this->buckets[index]; while (true) { if (bucketPtr == NULL) { assert(Hashtable_isConsistent(this)); return NULL; } else if (bucketPtr->key == key) { assert(Hashtable_isConsistent(this)); return bucketPtr->value; } else bucketPtr = bucketPtr->next; } } void Hashtable_foreach(Hashtable* this, Hashtable_PairFunction f, void* userData) { assert(Hashtable_isConsistent(this)); for (int i = 0; i < this->size; i++) { HashtableItem* walk = this->buckets[i]; while (walk != NULL) { f(walk->key, walk->value, userData); walk = walk->next; } } assert(Hashtable_isConsistent(this)); }
htop源码获取:http://download.csdn.net/detail/u014495327/7142007
相关文章推荐
- 源码阅读-HashTable
- STL源码:hashtable
- HashTable的源码分析
- 第五篇:JAVA集合之Hashtable源码剖析
- Java容器源码分析-高并发处理Map-ConcurrentHashMap和HashTable
- java1.7集合源码赏析系列:HashTable、ConcurrentHashMap、HashMap差异分析
- 集合源码学习(十):HashTable(Java8)与HashMap比较
- java集合11--HashTable源码详解
- 从源码层理解Hashtable中的put和get
- 从源码理解Hashtable.java
- java集合框架中Hashtable源码(基于JDK1.6)
- Vector和Hashtable源码阅读与理解
- Java源码集合类Hashtable学习
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
- 非典型2D游戏引擎 Orx 源码阅读笔记(4) 用C实现的基本容器(List,HashTable,Tree)
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
- HashTable源码解析
- java的HashTable的部分源码分析
- 转:【Java集合源码剖析】Hashtable源码剖析
- 集合 4000 框架源码学习之HashTable