热门 购物 团购 理财 文学 人才 体育 汽车 游戏 软件 军事 音乐 视频 媒体 论坛 博客 银行 交友 综合
一起购 唯品会 梦芭莎 趣玩网 凡客诚品 麦考林 乐淘鞋网 弗克尚品 绿盒子 俏物悄语 新蛋网 当当网 玛萨玛索
拉手网 糯米网 爱帮团 聚划算 58团购 美团网 QQ团购 大众点评团 窝窝团 美淘网 满座网 团宝网 饭统饭团
起点网 榕树下 小说阅读 潇湘书院 红袖添香 幻剑书盟 新浪游戏 太平洋游戏 163邮箱 中国游戏 游戏中国 霏凡软件 铁血军事
访问本站赠送红包啦!凡在支付宝搜索数字口令 528131323 都将获得红包,天天搜索此口令天天得红包^_^
Health Sitology Family Finance Appliances Shopping Clothing Education Legal Rituals Beauty Property Travel Pet Medical Cyclopedia History Military Computers Sports Job Anecdote Geographic Mixed Entertain Literature Emotion Agriculture
/**
 * 任何人任何机构皆可用于任何项目,此软件免费无需书面授权
 * 在软件和软件的所有副本中都必须包含版权声明和软件相关注解
 *
 * 模块: htkv.c
 * 简述: HASH TABLE KEY VALUE
 * 作者: woods zhang  ->  hoojar@163.com -> http://www.hecart.com/
 * 版权: 2006-2018, 张树林 拥有此源码所有版权 (MIT许可协议)
 * Copyright 2006-2018, Woods Zhang All Rights Reserved (The MIT License)
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <stdbool.h>

#define HTKV_SIZE 32
typedef struct _htkv
{
    char key[33];
    char *val;
    struct _htkv *next;
} htkv;

htkv kvres[HTKV_SIZE];//定义HASH TABLE的大小

/**
* 对string进行散列并得到HASH TALBE的位置
*
* @param key 关键字
* @return hashcode所在的位置
*/
static unsigned int htkv_idx(char *key)
{
    unsigned int hashcode = 0;
    if (key != NULL)
    {
        while (*key != '')
        {
            hashcode += (int)(*key++);
        }
    }

    return (hashcode & 0x7FFFFFFF) % HTKV_SIZE;
}

/**
 * 根据关键字更新数据值
 *
 * @param item 要更新的结点项
 * @param key 关键字
 * @param val 数据值
 * @return 成功为true 失败为false
 */
bool htkv_update(htkv *item, char *key, char *val)
{
    if (strcmp(key, item->key) != 0)
    {
        return false;
    }

    int nlen = strlen(val);
    int olen = strlen(item->val);
    if (nlen > olen)
    {
        item->val = (char *) realloc(item->val, nlen + 1);
    }
    memcpy(item->val, val, nlen + 1);

    return true;
}

/**
 * 哈希表中插入一个值
 *
 * @param key 关键字
 * @param val 数据值
 * @return 成功为true 失败为false
 */
bool htkv_set(char *key, char *val)
{
    if (key == NULL || *key == '' || val == NULL)
    {
        return false;
    }

    htkv *item = &(kvres[htkv_idx(key)]);
    if (htkv_update(item, key, val))//已经存在的话则直接更新值
    {
        return true;
    }

    if (item->key[0] == '')//如果第一元素未被占用则使用第一元素
    {
        item->val = (char *) malloc(sizeof(char) * strlen(val) + 1);
        strcpy(item->key, key);
        strcpy(item->val, val);
        item->next = NULL;

        return true;
    }

    while (item->next)
    {
        if (htkv_update(item->next, key, val))//已经存在的话则直接更新值
        {
            return true;
        }
        item = item->next;
    }

    item->next = (htkv *) malloc(sizeof(htkv));
    item->next->val = (char *) malloc(sizeof(char) * strlen(val) + 1);
    strcpy(item->next->key, key);
    strcpy(item->next->val, val);
    item->next->next = NULL;

    return true;
}

/**
 * 根据关键字获取数据值
 *
 * @param key 关键字
 * @return 数据值
 */
char *htkv_get(char *key)
{
    if (key == NULL || *key == '')
    {
        return NULL;
    }

    htkv *item = &(kvres[htkv_idx(key)]);
    while (item)
    {
        if (strcmp(key, item->key) == 0)
        {
            return item->val;
        }
        item = item->next;
    }

    return NULL;
}

/**
 * 根据关键字删除结点
 *
 * @param key 关键字
 * @return 删除成功为true 反知为false
 */
bool htkv_del(char *key)
{
    if (key == NULL || *key == '')
    {
        return false;
    }

    htkv *item = &(kvres[htkv_idx(key)]);
    if (strcmp(key, item->key) == 0)
    {
        free(item->val);
        item->key[0] = '';
        item->val = NULL;

        return true;
    }

    htkv *temp = NULL;
    item = item->next;
    while (item)
    {
        if (strcmp(key, item->key) == 0)
        {
            temp = item;
            free(temp->val);
            item = temp->next;
            free(temp);

            return true;
        }
        item = item->next;
    }

    return false;
}

/**
 * 根据关键字从哈希表中检索是否存在
 *
 * @param key 关键字
 * @return 存在为true 反知为false
 */
bool htkv_exist(char *key)
{
    if (key == NULL || *key == '')
    {
        return false;
    }

    htkv *item = &(kvres[htkv_idx(key)]);
    while (item)
    {
        if (strcmp(key, item->key) == 0)
        {
            return true;
        }
        item = item->next;
    }

    return false;
}

/**
 * 打印出HASHMAP所存储的KEY与相关值
 *
 * @return 成功返回true否则为false
 */
bool htkv_print()
{
    int i;
    for (i = 0; i < HTKV_SIZE; i++)
    {
        htkv *item = &(kvres[i]);
        printf("htkv %d: ", i);
        while (item)
        {
            printf("[%s=%s] ", item->key, item->val);
            item = item->next;
        }
        printf(" ");
    }

    return true;
}

/**
 * 释放链接数据并销毁哈希表
 */
void htkv_free()
{
    int i = 0;
    htkv *temp = NULL;
    htkv *item = NULL;
    htkv *node = NULL;
    for (i = 0; i < HTKV_SIZE; i++)
    {
        item = &kvres[i];
        free(item->val);
        item->key[0] = '';
        item->val = NULL;
        node = item->next;
        while (node)
        {
            temp = node;
            free(temp->val);
            node = temp->next;
            free(temp);
        }
        item->next = NULL;
    }
}

int main()
{
    htkv_set("name", "woods");
    htkv_set("sex", "man");
    htkv_set("age", "12");
    htkv_set("bith", "2018-12-08");
    htkv_set("corp", "yunovo company");
    htkv_set("nation", "china");
    htkv_set("addr", "shen zhen guandong of china");

    char *name = htkv_get("name");
    printf("name:%s ", name);

    if (htkv_exist("sex"))
    {
        printf("sex exist ");
    }
    else
    {
        printf("sex without ");
    }

    htkv_del("bith1");
    htkv_print();
    htkv_free();

    printf("------------------------------------ ");
    htkv_set("name", "");
    name = htkv_get("corp");
    printf("corp:%s ", name);
    htkv_set("nation", "USA");

    htkv_print();

    return 0;
}
Reply content :
Photo link :
Wireless keyboards and pointing devices are not uncommon, and they're far less brick-like than they were in the early days. One thing to keep in mind, however -- if you allow your organization to begin to heavily use bluetooth for things like wireles…  Details
在Dos的年代,我们常会以拦截中断向量的方式,做到按下某个hotkey而自动执行某个程 式,在Window呢,也可以,不过它是用RegisterHotkey API来完成。 使用RegisterHotkey的概念是,它会定义一组…  Details
返回一个数组,其中包含了一个 Dictionary 对象中的全部现有的主键。object.Keys( ) 其中 object 总是一个 Dictionary 对象的名称。说明 下面这段代码说明了 Keys 方法的用法: function KeysDemo() { va…  Details
如何做到在任何一个程式之下,按下某个HotKey组合键,便将我们的视窗Activate起来, 这便得使用 WM_SETHOTKEY 来达成 WM_SETHOTKEY所需的叁数如下: wParam = (WPARAM) MAKEWORD(vkey, modifiers) lParam = 0…  Details
Introduction The United States has a serious problem in mathematics educationTest results show that beginning in middle school, the United States student proficiency declines in comparison with other developed countries throughout the world to ne…  Details
Wanna get rid of keyboards and mouses?Flexibility is the need of the hourMany of us find it hassling to carry laptops in business tours or in some presentationsThis is due to the lack of flexibility and portabilityManaging and handling a laptop with…  Details
/** * 任何人任何机构皆可用于任何项目,此软件免费无需书面授权 * 在软件和软件的所有副本中都必须包含版权声明和软件相关注解 * * 模块: htkv.c * 简述: HASH TABLE KEY VAL…  Details
如果说,我们想得知某些键被KeyIn的频率,或许会想,那设定Form KeyPreview不就可 以,是啊,不过这样做就变成您要使用者对着您的 Form做事才有,出了这个Form就没有 办法了,所以又要使用…  Details
SQL> create user a identified by a; --创建测试用户a SQL> grant connect,resource to a; --给用户a授权 SQL> conn a/a --以用户a连接 SQL> create table a1(a11 number primary key); SQL> insert into a1 values(1); SQ…  Details
以前CVS用习惯了,换到Subversion中以后,$wId$w不会自动替换感觉很不爽,后来一查文档,原来SVN用另外一个别扭的方式解决了这个问题。1、打开 C:Documents and SettingsQuietLifeApplication DataSubvers…  Details