htop源码中的Hashtable
来源:互联网 发布:java中的md5怎么解密 编辑:程序博客网 时间:2024/05/22 10:35
这里的Hashtable其实是hashmap,实现的是int型到void*的映射。
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
0 0
- htop源码中的Hashtable
- CentOS7 源码安装atop htop
- htop的源码编译方法
- SGISTL源码探究-STL中的hashtable(上)
- SGISTL源码探究-STL中的hashtable(下)
- htop
- htop
- htop
- HashTable源码
- RedHat离线安装htop源码包
- 从源码层理解Hashtable中的put和get
- java 中的集合(十五) Hashtable源码分析
- 【源码】Hashtable源码剖析
- 【源码】Hashtable源码剖析
- HashTable & HashSet 源码分析
- HashTable HashMap源码
- memcached源码学习-hashtable
- memcached源码学习-hashtable
- java笔记之异常
- Asp.Net MVC4.0 官方教程 入门指南之六--查看Edit方法和Edit视图
- int转6位16进制数。
- 简明python教程学习笔记(四)-标示符、变量、运算符
- 非静态的内部类会持有外部类的一个隐式引用
- htop源码中的Hashtable
- LocalActivityManager如何在一个Activity的一部分中显示其他Activity
- C++ boost::asio::serial_port 串口通信类 使用 封装
- Linux学习笔记之——Linux系统内部相关介绍
- 邮箱自动匹配下拉选项
- 不一样的Geek女的生活札记(1)
- grid block分配与原子加
- C语言编程 - 清空键盘缓冲区
- Asp.Net MVC4.0 官方教程 入门指南之七--增加搜索方法和视图