理由:
- 这样hash数组只用占一个指针,节约内存(主要的), 但这个一次指针也能做到
- 如果不是pprev, 插入头节点就需要强转,代码阅读不方便;
下面给出如果不是二次指针的情况
#include <stdio.h>
struct hlist_head {
struct hlist_node *first;
};
struct hlist_node {
struct hlist_node *next, *prev;
};
static void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
{
struct hlist_node *first = h->first;
n->next = first;
if (first)
first->prev = n;
h->first = n;
// 指向头结点被强转了
n->prev = (struct hlist_node*)h;
}
//那么原有的hlist如何插入
struct hlist_head {
struct hlist_node *first;
};
struct hlist_node {
struct hlist_node *next, **pprev;
};
// 没有转换, 比较简单
static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
{
struct hlist_node *first = h->first;
n->next = first;
if (first)
first->pprev = &n->next;
h->first = n;
n->pprev = &h->first;
}
本文探讨了使用二次指针而非一次指针在链表结构中的优势,包括内存节省和代码可读性的提升。通过具体示例对比了两种实现方式,并详细解释了如何在不进行类型转换的情况下实现链表节点的高效插入。
716

被折叠的 条评论
为什么被折叠?



