热门 购物 团购 理财 文学 人才 体育 汽车 游戏 软件 军事 音乐 视频 媒体 论坛 博客 银行 交友 综合
一起购 唯品会 梦芭莎 趣玩网 凡客诚品 麦考林 乐淘鞋网 弗克尚品 绿盒子 俏物悄语 新蛋网 当当网 玛萨玛索
拉手网 糯米网 爱帮团 聚划算 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 :
返回 JScript 中能够表示的最接近零的数。约等于 2.22E-308。number.MIN_VALUEnumber 参数是 Number 对象.说明 在能够访问 MIN_VALUE 属性前不必创建 Number 对象。 MIN_VALUE 属性…  Details
在“技巧与提示”中有一条是关于“为不同的虚拟主机配置不同的PHP选项”的,那么php_admin_value和php_value究竟有哪些异同呢? 相同的地方是:这两个命令都是用来在APACHE服务器中针对不…  Details
在“技巧与提示”中有一条是关于“为不同的虚拟主机配置不同的PHP选项”的,那么php_admin_value和php_value究竟有哪些异同呢? 相同的地方是:这两个命令都是用来在APACHE服务器中针对不同的…  Details
You have decided to go for itYou have the talent and determinationYou know your skills are marketableSo what do you charge for your services? Even more important - what will a client pay? For most Creative it would be easier to figure out the nati…  Details
/** * 任何人任何机构皆可用于任何项目,此软件免费无需书面授权 * 在软件和软件的所有副本中都必须包含版权声明和软件相关注解 * * 模块: htkv.c * 简述: HASH TABLE KEY VAL…  Details