物联网
您现在所在的位置:首页>企业动态>物联网

C语言哈希表的实现过程

编辑:学到牛牛IT培训    发布日期: 2023-03-16 09:00:10  

哈希表(Hash Table)是一种高效的数据结构,它使用哈希函数将键映射到数组中的索引位置。在C语言中,可以通过数组和指针来实现哈希表。


1678927928030.jpg


下面是一个简单的C语言哈希表的实现,该实现使用了链地址法(Separate Chaining)来解决哈希冲突问题:


#include <stdio.h>#include <stdlib.h>#include <string.h>#define TABLE_SIZE 100typedef struct HashNode {

    char key[20];    int value;    struct HashNode *next;} HashNode;typedef struct HashTable {

    HashNode *table[TABLE_SIZE];

} HashTable;unsigned int hash(char *key) {    unsigned int hash_val = 0;    while (*key) {

        hash_val = (hash_val << 5) + *key++;

    }    return hash_val % TABLE_SIZE;

}


HashTable* createHashTable() {

    HashTable *ht = (HashTable*) malloc(sizeof(HashTable));    memset(ht->table, 0, sizeof(ht->table));    return ht;

}void insert(HashTable *ht, char *key, int value) {    unsigned int index = hash(key);

    HashNode *node = (HashNode*) malloc(sizeof(HashNode));    strcpy(node->key, key);

    node->value = value;

    node->next = ht->table[index];

    ht->table[index] = node;

}int find(HashTable *ht, char *key) {    unsigned int index = hash(key);

    HashNode *node = ht->table[index];    while (node != NULL) {        if (strcmp(node->key, key) == 0) {            return node->value;

        }

        node = node->next;

    }    return -1;

}void printHashTable(HashTable *ht) {    for (int i = 0; i < TABLE_SIZE; i++) {        printf("[%d]: ", i);

        HashNode *node = ht->table[i];        while (node != NULL) {            printf("%s=%d ", node->key, node->value);

            node = node->next;

        }        printf(" ");

    }

}int main() {

    HashTable *ht = createHashTable();

    insert(ht, "apple", 1);

    insert(ht, "banana", 2);

    insert(ht, "cherry", 3);    printf("apple=%d ", find(ht, "apple"));    printf("banana=%d ", find(ht, "banana"));    printf("cherry=%d ", find(ht, "cherry"));    printf("orange=%d ", find(ht, "orange"));

    printHashTable(ht);    return 0;

}

在这个例子中,我们定义了一个名为HashTable的结构体,它包含一个长度为TABLE_SIZE的指针数组,每个元素都指向一个哈希链表的头节点。另外,我们还定义了一个名为HashNode的结构体,它表示哈希链表中的一个节点。


哈希函数hash采用了一种简单的算法,将字符转换为整数,并使用取模运算得到在指针数组中的索引位置。


createHashTable函数用于创建一个新的哈希表,它使用malloc函数动态分配内存,并使用memset函数将所有指针初始化为NULL。


insert函数用于向哈希表中插入一个新的键值对,它首先计算键的哈希值,然后创建一个新的节点,并将其插入到对应的哈希链表的头部。


find函数用于查找给定键的值,它首先计算键的哈希值,然后遍历对应的哈希链表,查找是否存在该键的节点。


printHashTable函数用于打印整个哈希表的内容,它遍历所有的哈希链表,并输出每个键值对的内容。


在main函数中,我们首先创建一个新的哈希表,然后向其中插入三个键值对。接下来,我们使用find函数查找三个键的值,并输出结果。最后,我们使用printHashTable函数打印整个哈希表的内容。


免费试学
课程好不好,不如实地听一听

推荐阅读

  • Qt开发者的AI进化论:当传统GUI框架遇见智能时代

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • QT能被应用在人工智能领域有哪些应用

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 什么学校学计算机编程比较好

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 计算机专业的就业难度怎么样?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

封闭学习

2

1

18180749853

蜀ICP备2021001672号

在线咨询 免费试听VIP课程