注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

[原] C开源hash代码uthash的用法总结(2)  

2013-11-13 10:49:33|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
5.完整程序例子
5.1key类型为int的完整的例子
2.0gd;"  >de>#include <stdio.h>   /* gets */de>
de>#include <stdlib.h>  /* atoi, malloc */de>
de>#include <string.h>  /* strcpy */de>
de>#include "uthash.h"de>
de> de>
de>struct my_struct {de>
de>    int ikey;                    /* key */de>
de>    char value[10];de>
de>    UT_hash_handle hh;         /* makes this structure hashable */de>
de>};de>
de> de>
de>static struct my_struct *g_users = NULL;de>
de> de>
de>void add_user(int mykey, char *value) {de>
de>    struct my_struct *s;de>
de> de>
de>    HASH_FIND_INT(users, &mykey, s);  /* mykey already in the hash? */de>
de>    if (s==NULL) {de>
de>      s = (struct my_struct*)malloc(sizeof(struct my_struct));de>
de>      s->ikey = mykey;de>
de>      HASH_ADD_INT( users, ikey, s );  /* ikey: name of key field */de>
de>    }de>
de>    strcpy(s->value, value);de>
de>}de>
de> de>
de>struct my_struct *find_user(int mykey) {de>
de>    struct my_struct *s;de>
de> de>
de>    HASH_FIND_INT( users, &mykey, s );  /* s: output pointer */de>
de>    return s;de>
de>}de>
de> de>
de>void delete_user(struct my_struct *user) {de>
de>    HASH_DEL( users, user);  /* user: pointer to deletee */de>
de>    free(user);de>
de>}de>
de> de>
de>void delete_all() {de>
de>  struct my_struct *current_user, *tmp;de>
de> de>
de>  HASH_ITER(hh, users, current_user, tmp) {de>
de>    HASH_DEL(users,current_user);  /* delete it (users advances to next) */de>
de>    free(current_user);            /* free it */de>
de>  }de>
de>}de>
de> de>
de>void print_users() {de>
de>    struct my_struct *s;de>
de> de>
de>    for(s=users; s != NULL; s=(struct my_struct*)(s->hh.next)) {de>
de>        printf("user ikey %d: value %s\n", s->ikey, s->value);de>
de>    }de>
de>}de>
de> de>
de>int name_sort(struct my_struct *a, struct my_struct *b) {de>
de>    return strcmp(a->value,b->value);de>
de>}de>
de> de>
de>int id_sort(struct my_struct *a, struct my_struct *b) {de>
de>    return (a->ikey - b->ikey);de>
de>}de>
de> de>
de>void sort_by_name() {de>
de>    HASH_SORT(users, name_sort);de>
de>}de>
de> de>
de>void sort_by_id() {de>
de>    HASH_SORT(users, id_sort);de>
de>}de>
de> de>
de>int main(int argc, char *argv[]) {de>
de>    char in[10];de>
de>    int ikey=1, running=1;de>
de>    struct my_struct *s;de>
de>    unsigned num_users;de>
de> de>
de>    while (running) {de>
de>        printf(" 1. add user\n");de>
de>        printf(" 2. add/rename user by id\n");de>
de>        printf(" 3. find user\n");de>
de>        printf(" 4. delete user\n");de>
de>        printf(" 5. delete all users\n");de>
de>        printf(" 6. sort items by name\n");de>
de>        printf(" 7. sort items by id\n");de>
de>        printf(" 8. print users\n");de>
de>        printf(" 9. count users\n");de>
de>        printf("10. quit\n");de>
de>        gets(in);de>
de>        switch(atoi(in)) {de>
de>            case 1:de>
de>                printf("name?\n");de>
de>                add_user(ikey++, gets(in));de>
de>                break;de>
de>            case 2:de>
de>                printf("id?\n");de>
de>                gets(in); ikey = atoi(in);de>
de>                printf("name?\n");de>
de>                add_user(ikey, gets(in));de>
de>                break;de>
de>            case 3:de>
de>                printf("id?\n");de>
de>                s = find_user(atoi(gets(in)));de>
de>                printf("user: %s\n", s ? s->value : "unknown");de>
de>                break;de>
de>            case 4:de>
de>                printf("id?\n");de>
de>                s = find_user(atoi(gets(in)));de>
de>                if (s) delete_user(s);de>
de>                else printf("id unknown\n");de>
de>                break;de>
de>            case 5:de>
de>                delete_all();de>
de>                break;de>
de>            case 6:de>
de>                sort_by_name();de>
de>                break;de>
de>            case 7:de>
de>                sort_by_id();de>
de>                break;de>
de>            case 8:de>
de>                print_users();de>
de>                break;de>
de>            case 9:de>
de>                num_users=HASH_COUNT(users);de>
de>                printf("there are %u users\n", num_users);de>
de>                break;de>
de>            case 10:de>
de>                running=0;de>
de>                break;de>
de>        }de>
de>    }de>
de> de>
de>    delete_all();  /* free any structures */de>
de>    return 0;de>
de>}de>
5.2key类型为字符数组的完整的例子
de>color:navy;"  >#include <string.h>  /* strcpy */de>
de>#include <stdlib.h>  /* malloc */de>
de>#include <stdio.h>   /* printf */de>
de>#include "uthash.h"de>
de> de>
de>struct my_struct {de>
de>    char name[10];             /* key (string is WITHIN the structure) */de>
de>    int id;de>
de>    UT_hash_handle hh;         /* makes this structure hashable */de>
de>};de>
de> de>
de> de>
de>int main(int argc, char *argv[]) {de>
de>    const char **n, *names[] = { "joe", "bob", "betty", NULL };de>
de>    struct my_struct *s, *tmp, *users = NULL;de>
de>    int i=0;de>
de> de>
de>    for (n = names; *n != NULL; n++) {de>
de>        s = (struct my_struct*)malloc(sizeof(struct my_struct));de>
de>        strncpy(s->name, *n,10);de>
de>        s->id = i++;de>
de>        HASH_ADD_STR( users, name, s );de>
de>    }de>
de> de>
de>    HASH_FIND_STR( users, "betty", s);de>
de>    if (s) printf("betty's id is %d\n", s->id);de>
de> de>
de>    /* free the hash table contents */de>
de>    HASH_ITER(hh, users, s, tmp) {de>
de>      HASH_DEL(users, s);de>
de>      free(s);de>
de>    }de>
de>    return 0;de>
de>}de>
5.3key类型为字符指针的完整的例子
de>color:navy;"  >#include <string.h>  /* strcpy */de>
de>#include <stdlib.h>  /* malloc */de>
de>#include <stdio.h>   /* printf */de>
de>#include "uthash.h"de>
de> de>
de>struct my_struct {de>
de>    const char *name;          /* key */de>
de>    int id;de>
de>    UT_hash_handle hh;         /* makes this structure hashable */de>
de>};de>
de> de>
de> de>
de>int main(int argc, char *argv[]) {de>
de>    const char **n, *names[] = { "joe", "bob", "betty", NULL };de>
de>    struct my_struct *s, *tmp, *users = NULL;de>
de>    int i=0;de>
de> de>
de>    for (n = names; *n != NULL; n++) {de>
de>        s = (struct my_struct*)malloc(sizeof(struct my_struct));de>
de>        s->name = *n;de>
de>        s->id = i++;de>
de>        HASH_ADD_KEYPTR( hh, users, s->name, strlen(s->name), s );de>
de>    }de>
de> de>
de>    HASH_FIND_STR( users, "betty", s);de>
de>    if (s) printf("betty's id is %d\n", s->id);de>
de> de>
de>    /* free the hash table contents */de>
de>    HASH_ITER(hh, users, s, tmp) {de>
de>      HASH_DEL(users, s);de>
de>      free(s);de>
de>    }de>
de>    return 0;de>
de>}de>

  评论这张
 
阅读(597)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017