if (bucket->head_node_ == NULL) { Value* new_value = NULL; Node* new_node = ApplyForOneNode(); //申请 key if (new_node == NULL) { return NULL; } if (!value) { new_value = value_mem->ApplyOneValue(1); //申请 value } else { new_value = value; new_value->use_count_++; } if (new_value == NULL) { return NULL; } bucket->head_node_ = new_node; bucket->head_node_->next_node_ = NULL; bucket->head_node_->value_ = new_value; DupKey(new_node->key_, key_data); SetConflictCount(INSERT_TYPE, conflict_count); return bucket->head_node_; }else {什么意思
时间: 2024-02-14 07:32:18 浏览: 64
这段代码是一个哈希表中的插入操作。如果哈希桶中的头结点为空,说明这个桶还没有被使用过,需要先申请一个新的节点并将其作为头结点。在申请新节点的同时,也要申请一个新的值作为节点的值(如果传入的值为空,则需要申请一个大小为1的新值)。最后,将新节点的键值复制为插入的键值,设置冲突计数并返回新节点。
如果哈希桶中已经存在节点,则需要在已有节点的基础上进行插入操作。
相关问题
//未发现冲突,直接保存 Value* new_value = NULL; Node* new_node = ApplyForOneNode(); Node* old_head = bucket->head_node_; if (new_node == NULL) { return NULL; } if (!value) { new_value = value_mem->ApplyOneValue(1); } else { new_value = value; new_value->use_count_++; } if (new_value == NULL) { return NULL; } bucket->head_node_ = new_node; bucket->head_node_->next_node_ = old_head; bucket->head_node_->value_ = new_value; DupKey(new_node->key_, key_data); SetConflictCount(INSERT_TYPE, conflict_count); return bucket->head_node_;什么意思
这段代码是一个哈希表中插入元素的函数实现。具体来说,它执行以下操作:
1. 申请一个新的节点new_node;
2. 暂存bucket的原始头节点old_head;
3. 如果value为空,就申请一个新的value并将其赋值给new_value,否则将value赋值给new_value并增加其引用计数;
4. 将new_node作为新的头节点赋值给bucket,并将其next_node指向原始头节点old_head;
5. 将new_value赋值给new_node的value_;
6. 复制key_data到new_node的key_;
7. 调用SetConflictCount函数来设置哈希表中的冲突计数;
8. 返回新的头节点bucket->head_node_。
其中,ApplyForOneNode和ApplyOneValue是分别用来申请节点和值的内存的函数。这个函数的主要目的是将一个新的键值对插入到哈希表中,并返回插入后的头节点。
Node* Delete(Key& key_data, uint32_t key_hash, EditType type = DELETE_TYPE, HashValue<Value>* value_mem = NULL, Value* value = NULL) { Bucket* bucket = hash_bucket_ + key_hash; int conflict_count = 0; if (bucket->head_node_ == NULL) { SetConflictCount(DELETE_TYPE, conflict_count); return NULL; } Node* pre_node = NULL; Node* cur_head_node = bucket->head_node_; Node* free_node = cur_head_node; while(free_node) { conflict_count++; if (CmpKey(free_node->key_, key_data)) { DoubleLinkRemoveAt(&double_link_, &free_node->doublelink_node_); value_mem->ReleaseOneValue(free_node->value_->node_ptr_); free_node->value_ = NULL; free_node->key_.Reset(); if (free_node == cur_head_node) {//头结点被释放 if (free_node->next_node_ == NULL) {//只有一个节点 bucket->head_node_ = NULL; } else { bucket->head_node_ = free_node->next_node_; } } else {//非头结点被释放 pre_node->next_node_ = free_node->next_node_; } ReleaseNode(free_node); SetConflictCount(DELETE_TYPE, conflict_count); return (Node*)1; //特殊返回 ! } pre_node = free_node; free_node = free_node->next_node_; } SetConflictCount(DELETE_TYPE, conflict_count); return NULL; }什么意思
这段代码是哈希表中删除一个节点的函数实现。传入参数包括key_data(要删除节点的键值)、key_hash(键值的哈希值)、type(编辑类型,默认为删除类型)、value_mem(哈希表中value的内存分配器)、value(要删除节点的值)。
函数首先找到哈希表中对应的bucket,然后遍历bucket中的所有节点,查找要删除的节点。如果找到了,就从双向链表中删除该节点,并释放其占用的内存空间。如果被删除的节点是头结点,需要特殊处理。最后返回一个指针,如果是特殊返回值1,表示删除成功;如果是NULL,表示未找到要删除的节点。
阅读全文