c语言实现哈希表链式法

C语言哈希链表是一种数据结构,它结合了哈希表链表的特点,可以高效地进行数据的插入、删除和查找操作,在C语言中,我们可以使用结构体和指针来实现哈希链表的建立,下面是详细的技术介绍:

1、定义哈希链表结构体

c语言实现哈希表链式法

我们需要定义一个哈希链表的结构体,包括一个数组用于存储哈希表的桶,一个整数表示当前哈希表的大小,以及一个链表头指针用于存储哈希表中的所有节点。

include <stdio.h>
include <stdlib.h>
include <string.h>
typedef struct Node {
    char *key;
    int value;
    struct Node *next;
} Node;
typedef struct HashTable {
    Node **buckets;
    int size;
    int count;
} HashTable;

2、初始化哈希表

接下来,我们需要实现一个初始化哈希表的函数,该函数会创建一个指定大小的哈希表,并初始化所有桶为空。

HashTable *create_hash_table(int size) {
    HashTable *table = (HashTable *)malloc(sizeof(HashTable));
    table->buckets = (Node **)malloc(size * sizeof(Node *));
    for (int i = 0; i < size; i++) {
        table->buckets[i] = NULL;
    }
    table->size = size;
    table->count = 0;
    return table;
}

3、计算哈希值

为了将键值对存储到正确的桶中,我们需要计算键的哈希值,这里我们使用简单的取模运算来计算哈希值。

c语言实现哈希表链式法

unsigned int hash(const char *key, int size) {
    unsigned int hash_value = 0;
    for (int i = 0; key[i]; i++) {
        hash_value = (hash_value * 31 + key[i]) % size;
    }
    return hash_value;
}

4、插入键值对

插入键值对时,我们需要先计算键的哈希值,然后将键值对插入到对应的桶中,如果桶已满,我们需要创建一个新的节点并将键值对插入到新的桶中,更新哈希表的大小和计数。

void insert(HashTable *table, const char *key, int value) {
    unsigned int index = hash(key, table->size);
    Node *node = (Node *)malloc(sizeof(Node));
    node->key = strdup(key);
    node->value = value;
    node->next = table->buckets[index];
    table->buckets[index] = node;
    table->count++;
}

5、查找键值对

查找键值对时,我们需要先计算键的哈希值,然后在对应的桶中查找键值对,如果找到了键值对,返回其值;否则返回-1。

int find(HashTable *table, const char *key) {
    unsigned int index = hash(key, table->size);
    Node *node = table->buckets[index];
    while (node) {
        if (strcmp(node->key, key) == 0) {
            return node->value;
        }
        node = node->next;
    }
    return -1;
}

6、删除键值对

c语言实现哈希表链式法

删除键值对时,我们需要先计算键的哈希值,然后在对应的桶中查找键值对,如果找到了键值对,将其从链表中删除;否则不做任何操作,更新哈希表的大小和计数,注意,这里我们没有释放节点的内存,因为链表中的其他节点可能仍然引用它,在实际应用中,可以在适当的时候释放节点的内存。

void delete(HashTable *table, const char *key) {
    unsigned int index = hash(key, table->size);
    Node **current = &table->buckets[index];
    while (*current) {
        if (strcmp(*current->key, key) == 0) {
            Node *temp = *current;
            *current = (*current)->next;
            free(temp->key); // 释放节点的内存(可选)
            table->count--; // 更新哈希表的计数(可选)
            return; // 找到并删除了键值对,直接返回(可选)
        } else {
            current = &(*current)->next; // 继续查找下一个节点(可选)
        }
    } // 如果遍历完链表都没有找到键值对,不做任何操作(可选)
}

7、释放哈希表内存

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/349595.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-03-07 22:25
Next 2024-03-07 22:31

相关推荐

  • C语言strcat函数的作用是什么

    C语言strcat函数的作用是什么C语言中的strcat函数是一个用于将一个字符串追加到另一个字符串的末尾的函数,它的原型如下:。dest是目标字符串,src是源字符串,函数会将src字符串追加到dest字符串的末尾,并在追加完成后返回dest字符串,需要注意的是,dest字符串必须有足够的空间来容纳追加后的字符串,否则可能会导致内存溢出或未定义行为,下面我们通过一个简单的示例来说明strca

    2023-12-18
    0141
  • c语言中while循环怎么用

    C语言中的while循环语句是一种基本的循环结构,它根据给定的条件重复执行一段代码,while循环语句的语法如下:while (条件表达式) { // 循环体(需要重复执行的代码)}当条件表达式的结果为真(非零)时,循环体内的代码将被执行,每次执行完循环体后,条件表达式会再次被评估,如果条件表达式的结果仍然为真,循环将继续执行,当条件……

    2023-12-27
    0105
  • 怎么使用c语言输出实心正方形

    在C语言中,输出实心正方形可以通过字符数组和循环语句来实现,下面将详细介绍如何使用C语言输出实心正方形。1、准备工作我们需要包含头文件stdio.h,该头文件包含了标准输入输出函数的声明,我们需要定义一个字符数组来存储正方形的字符表示。include &lt;stdio.h&gt;int main() { char s……

    2024-01-05
    0219
  • 如何在Linux环境下使用C语言监控C++应用程序的端口?

    在Linux系统中,你可以使用netstat命令来监控C++应用的端口。你需要知道C++应用正在使用的端口号,然后运行以下命令:,,``bash,netstat tuln | grep 端口号,``,,这将显示与指定端口号相关的所有网络连接信息。

    2024-07-25
    046
  • c语言编译成功无法运行怎么解决

    您好,如果您的C语言程序编译成功但无法运行,可能有以下原因:,,1. 程序被杀毒软件拦截了,尝试关闭杀毒软件重新运行。,2. 编译器兼容性问题,在右上角的编译器菜单中选择一个其它版本的TDM-GCC重新编译(原来是32位则更换为64位,原来是Debug则更换为Release)。,3. 误选了“64位”的选项,可以在“编译配置”下拉框中改选含有“32位”的选项,然后重新编译运行。,4. 程序里有中文字符。,5. 用#include"stdio.h"这种方式调用需要.h文件在当前路径下。建议您改成#include比较好。

    2024-01-24
    0512
  • C语言怎么实现删除功能

    在C语言中,可以使用malloc()函数动态分配内存,然后使用free()函数释放内存以实现删除功能。

    2024-01-19
    0325

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入