C语言实现哈希表查找:班级人员名单查询
C语言实现哈希表查找:班级人员名单查询
本文将介绍如何使用C语言实现一个哈希表,并将其应用于班级人员名单的快速查找。
一、问题分析
我们需要设计一个哈希表来存储班级人员名单,并实现快速查找功能。为了解决哈希冲突,我们将采用链地址法。
二、哈希表创建
以下是使用C语言创建哈希表的代码:c#include <stdio.h>#include <stdlib.h>#include <string.h>
#define MAX_SIZE 100 // 哈希表的最大容量
// 定义哈希表的节点结构typedef struct Node { char name[20]; // 人名 struct Node* next; // 指向下一个节点的指针} Node;
// 创建哈希表Node* createHashTable() { Node* hashTable = (Node*)malloc(MAX_SIZE * sizeof(Node)); for (int i = 0; i < MAX_SIZE; i++) { hashTable[i].next = NULL; } return hashTable;}
// 计算哈希值int hash(char* name) { int sum = 0; for (int i = 0; i < strlen(name); i++) { sum += name[i]; } return sum % MAX_SIZE;}
// 在哈希表中插入节点void insertNode(Node* hashTable, char* name) { int index = hash(name); Node* newNode = (Node*)malloc(sizeof(Node)); strcpy(newNode->name, name); newNode->next = hashTable[index].next; hashTable[index].next = newNode;}
// 在哈希表中查找节点Node* searchNode(Node* hashTable, char* name) { int index = hash(name); Node* node = hashTable[index].next; while (node != NULL) { if (strcmp(node->name, name) == 0) { return node; } node = node->next; } return NULL;}
int main() { Node* hashTable = createHashTable();
// 添加人名到哈希表 insertNode(hashTable, '张三'); insertNode(hashTable, '李四'); insertNode(hashTable, '王五'); insertNode(hashTable, '赵六');
// 查找人名并输出结果 char name[20]; printf('请输入要查找的人名:'); scanf('%s', name); Node* result = searchNode(hashTable, name); if (result != NULL) { printf('找到了:%s\n', result->name); } else { printf('没有找到该人名\n'); }
return 0;}
三、代码解析
-
创建哈希表:
createHashTable()函数创建一个包含MAX_SIZE个节点的哈希表,并将每个节点的next指针初始化为NULL。 -
哈希函数:
hash()函数接受一个字符串作为输入,并计算其哈希值。这里使用了简单的求和取余法,可以根据实际情况选择更优的哈希函数。 -
插入节点:
insertNode()函数首先计算待插入节点的哈希值,然后将其插入到对应索引的链表头部。 -
查找节点:
searchNode()函数首先计算待查找节点的哈希值,然后遍历对应索引的链表,比较节点名称是否匹配。 -
主函数:
main()函数中创建了一个哈希表,并插入了一些人名。然后,程序接受用户输入的人名,并在哈希表中查找,最后输出查找结果。
四、优化建议
-
哈希函数: 选择合适的哈希函数可以有效减少哈希冲突,提高查找效率。
-
冲突处理: 除了链地址法外,还可以使用开放地址法等方法处理哈希冲突。
-
动态扩容: 当哈希表中的元素过多时,可以考虑进行动态扩容,以保证查找效率。
五、总结
本文介绍了使用C语言实现哈希表的基本方法,并将其应用于班级人员名单的快速查找。哈希表是一种非常高效的数据结构,在实际开发中有着广泛的应用。
原文地址: https://www.cveoy.top/t/topic/f3Y6 著作权归作者所有。请勿转载和采集!