C语言实现的哈希表

C语言实现的哈希表
哈希表可以简单理解为多个链表的集合,将每个新的成员根据其哈希值进行分类,这样可以加快链表的查找速度
参考:https://www.cnblogs.com/s-b-b/p/6208565.html

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define HASHSIZE 10

typedef unsigned int uint;
/*定义一个链表的节点*/
typedef struct Node{
    char key[17];
    char value[4];
    struct Node *next;
}Node;

/*定义一组链表*/
Node *node[HASHSIZE];

/*初始化:为链表头开辟空间*/
int init(Node *node)
{
    node = (Node *)malloc(sizeof(Node));
    if(NULL == node)
        return 1;

    bzero(node, sizeof(Node));

    return 0;
}

/*计算哈希值*/
uint hash(const char *key){
    uint hash = 0;
    for(; *key; ++key)
    {
        hash = hash*33+*key;
    }
    return hash%HASHSIZE;
}

/*查找:根据哈希值得出index, 然后到对应的链表中查找*/
Node *lookup(const char *key)
{
    Node *np;
    uint index;
    index = hash(key);
    for(np = node[index];np;np = np->next){
        if(!strcmp(key, np->key))
            return np;
    }
    return NULL;
}

/*插入:先查找该值是否存在,然后计算哈希值,插入对应的链表*/
uint install(const char *key, const char *value)
{
    uint index;
    Node *np;

    if(!(np = lookup(key))){
        index = hash(key);
        np = (Node*)malloc(sizeof(Node));
        if(!np)
            return 1;
        strcpy(np->key, key);
        strcpy(np->value, value);

        np->next = node[index];
        node[index] = np;
    }
    return 0;
}

/*例:*/
int main(void)
{
    /*为哈希表插入一组数据*/
    char key[17] = "10.10.16.31";
    char value[4] = "001";
    install(key, value);

    char key1[17] = "10.10.16.32";
    char value1[4] = "002";
    install(key1, value1);

    char key2[17] = "10.10.16.33";
    char value2[4] = "003";
    install(key2, value2);

    char key3[17] = "10.10.16.34";
    char value3[4] = "004";
    install(key3, value3);

    char key4[17] = "10.10.16.41";
    char value4[4] = "005";
    install(key4, value4);

    Node *np;

    /*哈希表初始化:如果不为表头赋值的话可以省略*/
    int i,j;
    for(i=0;i<HASHSIZE;i++){
        init(node[i]);
    }

    /*遍历哈希表*/
    for(i=0; i<HASHSIZE; i++)
    {
        if(node[i]){
            printf("i:%d, key:%s, value:%s\n", i, node[i]->key, node[i]->value);

            np = node[i]->next;
            while(np){
                printf("key:%s, value:%s\n", np->key, np->value);
                np = np->next;
            }
        }
    }
    return 0;
}

原文地址:http://blog.51cto.com/13603157/2285817

时间: 2024-11-09 00:48:40

C语言实现的哈希表的相关文章

手把手教你用C语言编写一个哈希表

原文链接:https://www.swack.cn/wiki/001558681974020669b912b0c994e7090649ac4846e80b2000/001572849111298ae30696043604e45a4c83f0e9842b818000 简介: 本文摘自 jamesroutley/write-a-hash-table 文章 GitHub 地址:https://github.com/jamesroutley/write-a-hash-table 源码 GitHub 原作

R语言——哈希表

前言: 在 R 语言中有个包--hash 包提供了我们需要的哈希结构,本文主要介绍该 hash 包的使用. (使用之前先 install.packages("hash") 进行安装) 其实,数据框也可以实现哈希表的功能,但是效率不高,操作也不方便. 另外,曾经出现过 rdict 包,使用起来就像 Python 里面的字典一样好用,详情请见:rdict: A hash table for R using skip lists.但是好像后来被 CRAN 取消了,也有可能是把它合并到其它包里

简单的哈希表实现 C语言

简单的哈希表实现 简单的哈希表实现 原理 哈希表和节点数据结构的定义 初始化和释放哈希表 哈希散列算法 辅助函数strDup 哈希表的插入和修改 哈希表中查找 哈希表元素的移除 哈希表打印 测试一下 这是一个简单的哈希表的实现,用c语言做的. 原理 先说一下原理. 先是有一个bucket数组,也就是所谓的桶. 哈希表的特点就是数据与其在表中的位置存在相关性,也就是有关系的,通过数据应该可以计算出其位置. 这个哈希表是用于存储一些键值对(key -- value)关系的数据,其key也就是其在表中

C语言-简单哈希表(hash table)

腾讯三面的时候,叫我写了个哈希表,当时紧张没写好···结果跪了··· 回来后粪发涂墙,赶紧写了一个! 什么都不说了···先让我到厕所里面哭一会··· %>_<% 果然现场发挥,以及基础扎实才是important的! 用链地址法解决冲突的哈希表(C语言,VS2008编写.测试): 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h>

c语言构建哈希表

/*哈希查找 *哈希函数的构造方法常用的有5种.分别是: *数字分析法 *平方取中法 *分段叠加 *伪随机数 *除留取余法 *这里面除留取余法比较常用 *避免哈希冲突常用的方法有4种: *开放定址法(线性探测再散列.二次探测再散列) *链地址法 *再哈希法 *建立公共溢出区 其中,线性探测再散列比较常用*/ 这是一道2009年武汉科技大学的考研题,但是按照要求却做不出来,因为对7取模最多只有7个空间,不可能放进8个数,所以怀疑这道题是不是出错了,但这是考研题,应该不会出错吧.所以各位大神,你们怎

深入理解哈希表

有两个字典,分别存有 100 条数据和 10000 条数据,如果用一个不存在的 key 去查找数据,在哪个字典中速度更快? 有些计算机常识的读者都会立刻回答: “一样快,底层都用了哈希表,查找的时间复杂度为 O(1)”.然而实际情况真的是这样么? 答案是否定的,存在少部分情况两者速度不一致,本文首先对哈希表做一个简短的总结,然后思考 Java 和 Redis 中对哈希表的实现,最后再得出结论,如果对某个话题已经很熟悉,可以直接跳到文章末尾的对比和总结部分. 哈希表概述 Objective-C 中

Redis源码研究—哈希表

Redis源码研究-哈希表 Category: NoSQL数据库 View: 10,980 Author: Dong 作者:Dong | 新浪微博:西成懂 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址:http://dongxicheng.org/nosql/redis-code-hashtable/ 本博客的文章集合:http://dongxicheng.org/recommend/ 本博客微信公共账号:hadoop123(微信号为:hadoop-123),分享

Code Review:C#与JAVA的哈希表内部机制的一些区别

看C#与JAVA源码时发现C#与JAVA哈希表的实现略有不同,特此分享一下. 我觉得看哈希表的机制可以从"碰撞"这里划线分为两部分来分析. 1,发生碰撞前 在发生碰撞前决定get与put的速度唯一因素是通过哈希函数计算键值位置的速度.而占用空间大小取决于需要的桶的数量(取决于极限装载值(load factor)(假设已知需要放入哈希表中元素的数量)),和桶的大小. C#的默认装载系数=0.72 // Based on perf work, .72 is the optimal load

Linux内核哈希表中的bucket桶

哈希表 哈希表(Hashtable)又称为“散列”,Hashtable是会根据索引键的哈希程序代码组织成的索引键(Key)和值(Value)配对的集合.Hashtable 对象是由包含集合中元素的哈希桶(Bucket)所组成的.而Bucket是Hashtable内元素的虚拟子群组,可以让大部分集合中的搜寻和获取工作更容易.更快速. 哈希函数(Hash Function)为根据索引键来返回数值哈希程序代码的算法.索引键(Key)是被存储对象的某些属性值(Value).当对象加入至 Hashtabl