《Linunx6.9 内核开发》链表解读-1

代码示例

struct hlist_head{
struct hlist_node *first;
};
struct hlist_node{
struct hlist_node * next,**pprev;
};

解读如下:

一、参数

1. struct hlist_head
hlist_head 是链表的头节点,它包含一个指向链表第一个节点的指针 first。

2. struct hlist_node
hlist_node 是链表中的节点结构,它包含两个成员:

  • next:指向下一个节点的指针。
  • pprev:指向指向当前节点的指针的指针。

二、为什么使用二级指针 (**pprev)?

维护链表结构的灵活性和效率,pprev 是一个指向指针的指针,它指向的是指向当前节点的指针。具体来说,pprev 可以是:

  • 如果当前节点是链表中的第一个节点,pprev 就指向 hlist_head 中的 first。
  • 如果当前节点不是第一个节点,pprev 就指向前一个节点的 next。
    这样设计的好处是,当我们删除或插入节点时,只需要操作一次指针即可,无需遍历链表或更新多个指针。

2.1 插入节点的操作

假设我们要在链表中插入一个新节点 new_node,具体步骤如下:

  1. 将 new_node->next 设为当前节点 node 的 next。
  2. 将 new_node->pprev 设为当前节点 node 的 pprev。
  3. 如果 node->next 不为空,将 node->next->pprev 设为 &new_node->next。
  4. 将 *node->pprev 设为 new_node。
    通过这种方式,可以高效地插入节点而不需要遍历链表。

2.2 删除节点的操作

假设我们要删除一个节点 node,具体步骤如下:

  1. 如果 node->next 不为空,将 node->next->pprev 设为 node->pprev。
  2. 将 *node->pprev 设为 node->next。

同样,通过这种方式,可以高效地删除节点而无需遍历链表。
使用二级指针 (**pprev) 可以在不增加复杂度的情况下,简化链表节点的插入和删除操作。这种设计使得链表的操作更加高效,因为每次操作只需要更新一个指针,而不需要遍历整个链表或更新多个指针。

三、图示解析

链表结构图示
假设有一个链表,包含三个节点:node1、node2 和 node3。
在这里插入图片描述

1、详细节点指针关系

初始状态
假设初始状态链表中有三个节点 node1、node2 和 node3,指针关系如下:
在这里插入图片描述

插入节点

假设我们要在 node2 和 node3 之间插入一个新节点 new_node。

插入前的指针关系:
在这里插入图片描述

插入后的步骤:

  1. 将 new_node->next 设为 node3。
  2. 将 new_node->pprev 设为 &node2->next。
  3. 将 node2->next 设为 new_node。
  4. 将 node3->pprev 设为 &new_node->next。

插入后的指针关系:
在这里插入图片描述

删除节点

假设我们要删除 node2

删除前的指针关系:
在这里插入图片描述

删除 node2 的步骤:

  1. 将 node1->next 设为 node2->next(即 node3)。
  2. 将 node3->pprev 设为 node2->pprev(即 &node1->next)。

删除后的指针关系:
在这里插入图片描述

通过这两个操作示例,可以看出使用二级指针 (**pprev) 的好处,在插入和删除节点时不需要遍历链表,只需更新相关的指针即可。

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值