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语言fprintf函数的用法

    C语言中的fprintf函数用于将格式化的数据输出到指定的文件流中。它接受一个文件指针、一个格式字符串和一系列参数,根据格式字符串中的格式说明符将参数格式化后写入文件。

    2024-01-18
    0190
  • c语言怎么判断输入字符个数的大小

    C语言是一种通用的、过程式的计算机程序设计语言,广泛应用于各种领域,在C语言中,我们可以使用各种方法来处理输入和输出,其中判断输入字符个数是一个常见的需求,本文将详细介绍如何使用C语言判断输入字符个数,并提供一些相关的技术介绍和小标题,1、1 什么是strlen()函数?strlen()函数是C语言中的一个标准库函数,用于计算字符串的长度,它的原型如下:。要使用strlen()函数判断输入字符

    2023-12-19
    0144
  • C语言怎么实现密码输入功能

    在C语言中,实现密码输入功能可以通过多种方式,以下是其中一种常见的方法:1、使用scanf函数读取用户输入的密码。2、将用户输入的密码存储在一个字符数组中。3、为了保护密码的安全性,可以使用一个临时字符数组来存储用户输入的每一个字符,然后将其复制到最终的密码数组中。4、在复制过程中,可以使用getch函数来逐个读取用户输入的字符,而不……

    2023-12-31
    0247
  • C语言最常用的编译器有哪些

    C语言最常用的编译器有哪些?C语言是一种通用的、过程式的计算机程序设计语言,广泛应用于各种领域,为了将C语言编写的程序转换成计算机可以执行的机器代码,我们需要使用编译器,编译器是将源代码(如C语言源代码)转换成目标代码(如汇编代码或机器代码)的过程,本文将介绍一些常用的C语言编译器。1、GCC(GNU Compiler Collect……

    2024-02-17
    0198
  • c语言入门一般多久

    接下来,给各位带来的是c语言入门要多久的相关解答,其中也会对c语言入门一般多久进行详细解释,假如帮助到您,别忘了关注本站哦!请问大神,零基础学习c语言,要要多久呢?1、零基础学编程主要看自己想要学到什么程度。如果是全面了解基础知识,最快也要两个月。还想进一步学习,掌握更多的技能,希望能找到一份好工作的话,最快也要半年。2、时间会长点,如果你英语好,数学逻辑性好,专心学那么学c语言只需要半年或几个月就可以了。如果英语一般那么一年就可以,其实学程序也需要天赋和钻研精神,但是从纯C的控制台应用到带有界面的应用程序也需要一定的时间去摸索。

    2023-11-18
    0410
  • C语言socket bind函数怎么使用

    C语言中的socket编程是一种常用的网络编程方式,它提供了一套接口用于实现不同主机之间的通信,bind函数是socket编程中非常重要的一个函数,用于将套接字与特定的IP地址和端口号绑定在一起,下面将详细介绍C语言中socket bind函数的使用方法。1、函数原型: 在C语言中,bind函数的原型如下所示: ```c includ……

    2023-12-26
    0116

发表回复

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

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