hash - 哈希表函数 hlist_add_before 在 Linxu 内核中的实现
问题描述
哈希列表函数 hlist_add_before 在 linux 内核中的实现如下:
struct hlist_node {
struct hlist_node *next, **pprev;
};
/*
* This function is to add n before next
*/
static inline void hlist_add_before(struct hlist_node *n, struct hlist_node *next)
{
n->pprev = next->pprev;
n->next = next;
next->pprev = &n->next;
*(n->pprev) = n;
}
我*(n->pprev) = n
对函数的最后一行感到困惑。我认为只有前三行就足够了。怎么会有最后一行!!
解决方案
我终于明白了。它只是将最后一块拼图放在它的位置。在这个哈希列表函数中,它必须处理三角形关系。第一,切断原来的粘合,第二,在中间插入新的。第三,建立新人与之前和之后的人之间的联系。
*(n->pprev)
是指向下一个节点的指针。之前,它是下一个节点,但现在它是 n。前两行用于节点“n”。第三行是节点“下一个”。第四行是 n 前面的节点。有四行将整个列表连接在一起。
推荐阅读
- javascript - 如何使用 WEB USB API 从浏览器中的相机获取图片
- python - 我无法在函数中使用 winsound 播放声音
- r - 列到 x 轴
- flutter - Flutter:页面已处理,但 http 请求没有销毁/取消
- html - 电子邮件页脚 - 创建 HTML 页脚,但添加到 Outlook 时,切片之间会出现空白
- python - 如果调用多个函数,Python gspread API 不会附加行
- python - 类型错误:request() 缺少 1 个必需的位置参数:urllib3 中的“url”
- sql-server - 如何在 SQL Server 中拆分数组
- typescript - 在数组的过滤方法之后指定所需的类型
- ruby - 如何为 ruby gem 安装修复 Errno::ENXIO (postgresql)