C语言链地址法实现哈希表碰撞条目不显示,需定位add/print函数错误
问题分析
你的哈希表碰撞条目不显示的问题,add插入函数和print打印函数都存在错误,具体问题如下:
add插入函数存在2处严重错误
- 空槽判断逻辑完全错误
你使用Hash[hashIndex].value == NULL做判断有两个问题:一是Hash是全局数组,元素的value字段初始值为0,你全程没有对该字段赋值,所以它永远为0(和NULL比较永远为真),每次插入同哈希索引的元素都会直接覆盖Hash[hashIndex].next,之前的链表节点直接丢失,这是碰撞条目无法显示的核心原因。二是value是int类型,和指针类型的NULL比较本身就是逻辑错误,你用的是头结点不存数据的链地址实现,空槽应该判断Hash[hashIndex].next == NULL。 - 尾插逻辑存在空指针崩溃风险
else分支的遍历逻辑会循环到temp == NULL才停止,此时temp是空指针,直接执行temp->next = newNode会触发空指针访问异常,正确逻辑是循环到temp->next == NULL就停止,在当前temp节点后挂载新节点。
print打印函数存在2处错误
- 遍历终止条件错误
你用while(temp->next != NULL)做循环条件,链表最后一个节点的next为NULL,会直接跳过最后一个节点不打印。 - 空链表判断缺失
如果当前哈希索引下没有任何节点,temp = Hash[i].next就是NULL,直接访问temp->next会触发空指针崩溃。
另外你定义结构体时用了匿名结构体,内部的struct Hashnode* next属于不完整类型,部分编译器会报错,需要给结构体加上标签。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> // 给结构体加标签,避免内部next指针类型不完整 typedef struct Hashnode { int value; struct Hashnode* next; } Hashnode; void add(int value); void print(); Hashnode Hash[11]; int main() { add(12); add(44); add(13); add(88); add(23); add(94); add(11); add(39); add(20); add(16); add(5); print(); return 0; } void add(int value) { int hashIndex = value % 11; Hashnode* newNode = (Hashnode*)malloc(sizeof(Hashnode)); newNode->next = NULL; newNode->value = value; // 修复空槽判断逻辑 if (Hash[hashIndex].next == NULL) { Hash[hashIndex].next = newNode; } else { Hashnode* temp = Hash[hashIndex].next; // 修复尾插遍历逻辑 while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } void print() { Hashnode* temp; for (int i = 0; i < 11; i++) { temp = Hash[i].next; // 修复遍历条件,增加空链表判断 while (temp != NULL) { printf("%d, %d\n", i, temp->value); temp = temp->next; } } }
内容的提问来源于stack exchange,提问作者Hyeonbinshin
相关产品推荐
相关产品推荐

