linus大神的二级指针
Posted AlphaABCD
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linus大神的二级指针相关的知识,希望对你有一定的参考价值。
普通人删除单向链表中的一个节点的时候都会这样写:
typedef struct node
struct node * next;
....
node;
typedef bool (* remove_fn)(node const * v);
// Remove all nodes from the supplied list for which the
// supplied remove function returns true.
// Returns the new head of the list.
node * remove_if(node * head, remove_fn rm)
for (node * prev = NULL, * curr = head; curr != NULL; )
node * const next = curr->next;
if (rm(curr))
if (prev)
prev->next = next;
else
head = next;
free(curr);
else
prev = curr;
curr = next;
return head;
这里需要判断待删除的node是否头结点,导致了额外的指针定义(prev
)和不必要的if判断(if (prev)
)。
而linus大神给出的代码如下:
通过使用二级指针,可以一致的对待头结点和其它节点,并且函数不需要再返回值了(因为可以通过输入的node**head
在必要时直接修改链表头*head
)。
void remove_if(node ** head, remove_fn rm)
for (node** curr = head; *curr; )
node * entry = *curr;
if (rm(entry))
*curr = entry->next;
free(entry);
else
curr = &entry->next;
作者:胖子
链接:https://www.zhihu.com/question/477832027/answer/2044206446
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是关于linus大神的二级指针的主要内容,如果未能解决你的问题,请参考以下文章
C 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )