优质的响应式网站建设,网站开发哪个工具,信誉好的龙岗网站建设,wordpress问答社区模板1. uthash简介开源的第三方头文件#xff0c;这只是一个头文件#xff1a;uthash.h。uthash还包括三个额外的头文件#xff0c;主要提供链表#xff0c;动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。…1. uthash简介开源的第三方头文件这只是一个头文件uthash.h。uthash还包括三个额外的头文件主要提供链表动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。2 uthash的使用2.1 定义结构体2.2 添加2.3 查找2.4 替换2.5 删除2.6 循环删除2.7 删除哈希表所有元素2.8 计算哈希表元素个数2.9 遍历哈希表中的所有项目2.10 排序哈希表2.1 定义结构体#include uthash.h
struct my_struct {int id; /* key */char name[10];UT_hash_handle hh; /* makes this structure hashable */
};
/*声明哈希为NULL指针*/
struct my_struct *users NULL; /* important! initialize to NULL */
当结构体中的键值为字符串数组时
struct my_struct {char name[10]; /* key (string is WITHIN the structure) */int id;UT_hash_handle hh; /* makes this structure hashable */
};
当结构体中的键值为字符串指针时
struct my_struct {const char *name; /* key */int id;UT_hash_handle hh; /* makes this structure hashable */
};
2.2 添加 HASH_ADD_INT表示添加的键值为int类型 HASH_ADD_STR表示添加的键值为字符串类型 HASH_ADD_PTR表示添加的键值为指针类型 HASH_ADD表示添加的键值可以是任意类型void add_user(int user_id, char *name) {struct my_struct *s;/*重复性检查当把两个相同key值的结构体添加到哈希表中时会报错*/HASH_FIND_INT(users, user_id, s); /* id already in the hash? *//*只有在哈希中不存在ID的情况下我们才创建该项目并将其添加。否则我们只修改已经存在的结构。*/if (sNULL) {s (struct my_struct *)malloc(sizeof *s);s-id user_id;HASH_ADD_INT( users, id, s ); /* id: name of key field */}strcpy(s-name, name);
}
2.3 查找struct my_struct *find_user(int user_id) {struct my_struct *s;s (struct my_struct *)malloc(sizeof *s);HASH_FIND_INT( users, user_id, s ); /* s: output pointer */return s;
}
2.4 替换void replace_user(HashHead *head, HashNode *newNode) {HashNode *oldNode find_user(*head, newNode-id);if (oldNode)HASH_REPLACE_INT(*head, id, newNode, oldNode);
}
2.5 删除要从哈希表中删除结构必须具有指向它的指针。如果只有键请先执行HASH_FIND以获取结构指针。void delete_user(struct my_struct *user) {HASH_DEL(users, user); /* user: pointer to deletee */free(user); /* optional; its up to you! */
}
2.6 循环删除HASH_ITER是一个宏定义程序执行时被替换为一个循环void delete_all() {struct my_struct *current_user, *tmp;HASH_ITER(hh, users, current_user, tmp) {HASH_DEL(users,current_user); /* delete; users advances to next */free(current_user); /* optional- if you want to free */}
}
2.7 删除哈希表所有元素如果您只想删除所有项目但不释放它们或进行每个元素的清理则可以通过一次操作更有效地做到这一点HASH_CLEAR(hh,users);2.8 计算哈希表元素个数unsigned int num_users;
num_users HASH_COUNT(users);
printf(there are %u users\n, num_users);
2.9 遍历哈希表中的所有项目void print_users() {struct my_struct *s;for(susers; s ! NULL; ss-hh.next) {printf(user id %d: name %s\n, s-id, s-name);}
}
2.10 排序哈希表HASH_SORT( users, name_sort );