数据结构哈希表--c
链表法(优化--红黑树)
1.首先初始化一个数组用来存放链表头结点地址
HashTable *create_table(int size) {HashTable *table = malloc(sizeof(HashTable));table->size = size;table->buckets = calloc(size, sizeof(HashNode *)); // calloc会把内存初始化为0/NULLreturn table;
}
2.然后创建一个待插入节点
HashNode *new_node = malloc(sizeof(HashNode)); // 分配节点内存
new_node->key = strdup("苹果"); // 复制键字符串(避免外部修改)
new_node->value = 5; // 存储值
new_node->next = NULL; // 新节点的next指针设为NULL(因为是第一个节点)
3.使用哈希函数计算苹果的哈希值为2,如果buckets[2]为NULL ,则表示没有冲突,将新节点地址存放到buckets[2]
table->buckets[index] = new_node; // buckets[2]现在指向新创建的“苹果”节点
此时,桶2
的链表结构是:
buckets[2] → [key:"苹果", value:5, next:NULL]
4.此时假设要插入柚子 7 计算的哈希值与苹果冲突
(1)计算索引:还是2
。
(2)检查桶:buckets[2]
不是NULL
(已经有“苹果”节点)。
(3)遍历链表:比较“柚子”和“苹果”的键——不相等,说明没有重复。
(4)创建新节点:
初始化柚子
HashNode *new_node = malloc(sizeof(HashNode));
new_node->key = strdup("柚子");
new_node->value = 7;
头插法
new_node->next = table->buckets[2]; // 新节点的next指向原来的头节点(“苹果”)
table->buckets[2] = new_node; // 桶的头指针更新为新节点(“柚子”)
此时,桶2
的链表结构变成:
buckets[2] → [key:"柚子", value:7, next:→] [key:"苹果", value:5, next:NULL]
5.总结哈希表创建流程图
6.重要知识
a)哈希表为数组,数组存放节点链表的头结点地址;
b)使用哈希函数计算传入数据的哈希值 ,% 计算索引;
c)初始化待插入数据信息,检测该索引位置是否为NULL;
若为NULL,将待插入的头结点地址传入数组【索引】中;
若不为NULL,则将待插入节点插入桶中;