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 16:32:18 浏览: 34
这段代码是一个哈希表中的插入操作。如果哈希桶中的头结点为空,说明这个桶还没有被使用过,需要先申请一个新的节点并将其作为头结点。在申请新节点的同时,也要申请一个新的值作为节点的值(如果传入的值为空,则需要申请一个大小为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是分别用来申请节点和值的内存的函数。这个函数的主要目的是将一个新的键值对插入到哈希表中,并返回插入后的头节点。
if(free_node->node_type > NODE_TYPE_MAX) free_node->node_type = NODE_TYPE_MAX; if (nowtime - free_node->cur_time_ > hash_status_.timeout_interval_sec_[free_node->node_type]) // 超时 { if (free_node->value_) { delete free_node->value_; free_node->value_ = NULL; } if (free_node == bucket->head_node_) // 头结点被释放 { if (free_node->next_node_ == NULL) { bucket->head_node_ = NULL; next_node = NULL; } else { bucket->head_node_ = free_node->next_node_; next_node = free_node->next_node_; } } else // 非头结点被释放 { pre_node->next_node_ = free_node->next_node_; next_node = free_node->next_node_; } ReleaseNode(free_node); ++timeout_cnt; --bucket->item_count_; }什么意思
这段代码是删除哈希桶中的超时节点,并将其从链表中断开。
其中:
- `NODE_TYPE_MAX` 是节点类型的最大值;
- `nowtime` 是当前时间戳;
- `timeout_interval_sec_` 是一个数组,用于存储各个节点类型的超时时间。
具体来说,这段代码的作用是:
1. 检查节点类型是否超出最大值,如果超出则将其设置为最大值 `NODE_TYPE_MAX`;
2. 检查节点是否已经超时,如果已经超时则进行删除操作;
3. 删除节点的值(如果有的话),将其指针设置为 `NULL`;
4. 如果要删除的是头节点,则将头节点指针 `bucket->head_node_` 指向下一个节点(如果存在的话);否则将前一个节点的 `next` 指针指向下一个节点;
5. 释放要删除的节点(调用 `ReleaseNode` 函数),并更新哈希桶中的节点计数器和超时计数器。
总的来说,这段代码的作用是从哈希桶中删除一个超时的节点。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)