热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

哈希表的C语言链表实现

哈希表的C语言链表实现

哈希表的C语言链表实现

  • 1 哈希表的特点
  • 2 代码实现
    • 2.1 链表部分
      • 2.1.1 链表结点的结构
      • 2.1.2 创建链表
      • 2.1.3 销毁链表
      • 2.1.4 头插新结点
      • 2.1.5 根据id搜索链表
    • 2.2 Hash表部分
      • 2.2.1 创建Hash表
      • 2.2.2 清空表中元素
      • 2.2.3 摧毁整个Hash表
      • 2.2.4 Hash函数
      • 2.2.5 插入哈希表
      • 2.2.6 根据key搜索Hash表返回数据
  • 3 测试例程
    • 测试结果

1 哈希表的特点

结合了数组(索引快)和链表(可灵活增删结点)的优点。

在这里插入图片描述

2 代码实现

2.1 链表部分

2.1.1 链表结点的结构

typedef struct __tag_node{
int id;
struct __tag_node *pNext;
int satellite;
}Node;

2.1.2 创建链表

Node *LinkedList_Create(void)
{
Node *p = malloc(sizeof(Node));
if(p == NULL){
return NULL;
}
p->pNext = NULL;
p->id = 0; // The total quantity of nodes
return p;
}

2.1.3 销毁链表

void LinkedList_Destroy(Node *list)
{
Node *p = list->pNext; // Reserved header node
while(p){
Node *tmp = p;
p = p->pNext;
free(tmp);
}
list->pNext = NULL;
list->id = 0;
}

2.1.4 头插新结点

/**
* @brief Inserting a new node in the linked list
* @param list, The linked list will be inserted
* @param id, id number
* @param the satellite value of the id
**/

int LinkedList_InsertHead(Node *list, int id, int dat)
{
Node *p = malloc(sizeof(Node *));
if(p == NULL){
return -1;
}
p->id = id;
p->pNext = list->pNext;
list->pNext = p;
p->satellite = dat;
return 1;
}

2.1.5 根据id搜索链表

/**
* @brief search the id
* @param list, The hash table will be searched
* @param key, key
* @retval the satellite value of the id
**/

int LinkedList_Search(Node *list, int id)
{
Node *p = list->pNext;
for(Node *p = list->pNext; p; p = p->pNext){
if(id == p->id){
return p->satellite;
}
}
return 0;
}

2.2 Hash表部分

2.2.1 创建Hash表

Node **HashTable_Create(int len)
{
Node **p = malloc(len * sizeof(Node *));
for(int i = 0; i < len; i++){
p[i] = LinkedList_Create();
}
return p;
}

2.2.2 清空表中元素

void HashTable_Clear(Node **arr, int len)
{
for(int i = 0; i < len; i++){
LinkedList_Destroy(*(arr+i));
}
}

2.2.3 摧毁整个Hash表

void HashTable_Destroy(Node **arr, int len)
{
HashTable_Clear(arr, len);
for(int i = 0; i < len; i++){
free(arr[i]);
}
free(arr);
}

2.2.4 Hash函数

int HashTable_hashFunc(int key, int len)
{
return key % len;
}

2.2.5 插入哈希表

int HashTable_Insert(int key, int value, Node **table, int length)
{
if(LinkedList_InsertHead(table[HashTable_hashFunc(key, length)], key, value)){
return 1; // Success
}else{
return -1; // Failure
}
}

2.2.6 根据key搜索Hash表返回数据

/**
* @brief search the key
* @param table, The hash table will be searched
* @param length, The length of the hash table
* @retval the value of the key
**/

int HashTable_Search(int key, Node **table, int length)
{
return LinkedList_Search(table[HashTable_hashFunc(key, length)], key);
}
3 测试例程

#define __MAX_LEN_TABLE_ 10
int main(int argc, char *argv[])
{
Node **pHashTable;
pHashTable = HashTable_Create(__MAX_LEN_TABLE_);
if(HashTable_Insert(12, 125, pHashTable, __MAX_LEN_TABLE_)){
printf("Insert key = 12, value = 125 successful!\r\n");
}else{
printf("Insert key = 12 fail!\r\n");
}
if(HashTable_Insert(22, 255, pHashTable, __MAX_LEN_TABLE_)){
printf("Insert key = 22, value = 255 successful!\r\n");
}else{
printf("Insert key = 255 fail!\r\n");
}
int value = HashTable_Search(22, pHashTable, __MAX_LEN_TABLE_);
printf("value of key=22 is %d\r\n", value);
value = HashTable_Search(12, pHashTable, __MAX_LEN_TABLE_);
printf("value of key=12 is %d\r\n", value);
HashTable_Destroy(pHashTable, __MAX_LEN_TABLE_);

return 0;
}

测试结果

在这里插入图片描述


推荐阅读
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • 【妙】bug称它为数组越界的妙用
    1、聊一聊首先跟大家推荐一首非常温柔的歌曲,跑步的常听。本文主要把自己对C语言中柔性数组、零数组等等的理解分享给大家,并聊聊如何构建一种统一化的学习思想 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 如何在PHP中获取数组中特定元素的索引位置
    在PHP中获取数组中特定元素的索引位置有多种方法。首先,可以使用 `array_search()` 函数,其语法为 `array_search(目标值, $array)`,该函数将返回匹配元素的第一个键名(即下标)。其次,也可以利用 `array_keys()` 函数,通过 `array_keys($array, 目标值)` 语法来获取所有匹配元素的键名列表。这两种方法都能有效解决数组元素定位的问题,具体选择取决于实际需求和性能考虑。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
author-avatar
先进的山楂4l4_519
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有