关键词:
普通人删除单向链表中的一个节点的时候都会这样写:
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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
利用二级指针进行链表操作(代码片段)
...f0c;用来连接被删除节点的下一个节点,但实际上利用二级指针就可以避免多维护一个指针,使代码更加简洁。Linus的吐槽没错,到目前为止,我几乎没有在实际工作中看到过用二级指针进行 查看详情
c语言二级指针应用详解(代码片段)
文章目录二级指针概念二级指针应用之一:删除链表的结点二级指针应用之二:删除链表中的重复元素更多应用等待探索...二级指针概念普通的指针变量,实际上就是存储值类型的地址,这被称为一级指针。而二... 查看详情
一级指针与二级指针(代码片段)
文章目录一级指针二级指针小结一级指针改变指针所指向的内容,二级指针改变一级指针的内容(即,改变一级指针变量所存储的地址)一级指针地址传参,指针变量接受该地址,指针解引用,代表所... 查看详情
c二级指针(代码片段)
二级指针指针的指针 1typedefstruct intage; charname[20]; Person;intmain() Person**p=(Person**)malloc(sizeof(Person*)*num);//定义一个存放Person结构体指针长度为num大小的数组,数组存放元素为指针 Person*per=(Person*)malloc(sizeof(Person)); p[0]... 查看详情
c语言结构体(结构体中嵌套二级指针|为结构体内的二级指针成员分配内存|释放结构体内的二级指针成员内存)(代码片段)
文章目录一、结构体中嵌套二级指针1、结构体中嵌套二级指针类型声明2、为结构体内的二级指针成员分配内存3、释放结构体内的二级指针成员内存二、完整代码示例一、结构体中嵌套二级指针1、结构体中嵌套二级指针类型声... 查看详情
16二级指针(代码片段)
#include<stdio.h>voidfun(int**q);voidfun2(int**q);main()int*p;//把p的二级指针传给funfun(&p);printf("%d",*p);//动态分配内存fun2(&p);//----------------------------------------------------------------- 查看详情
二级指针作为形参的套路(代码片段)
//通常主函数会这么调用:intmain()int*a=NULL;//此处传入的是指针的地址,也就是指针的指针getNum(&a);return0;voidgetNum(int**a)//在这里,我们假设要传回一个size为5的a*a=(int*)malloc(sizeof(a)*5);for(inti=0;i<5;i++)(*a)[i]=i; 查看详情
c语言二级指针案例(字符串切割|返回自定义二级指针作为结果)(代码片段)
文章目录一、二级指针案例(返回自定义二级指针)二、完整代码示例一、二级指针案例(返回自定义二级指针)上一篇博客【C语言】二级指针案例(字符串切割|返回二维数组作为结果)中,使用的是二维数组,接收字符串切割结果;本篇... 查看详情
函数参数是二级指针的问题(代码片段)
实际应用中再一次遇到了函数参数是二级指针的问题,如下是正确的版本voidmain(void)//一级指针uint8*value_data_string=NULL;fun_change(&value_data_string);printf((char*)value_data_string);fun_free(&value_data_string);voidfun_change(u 查看详情
c语言二级指针案例(多级指针内存释放问题|多级指针避免野指针)(代码片段)
...了,则找不到低级指针;代码示例:/***@brieffree_memory释放二级指针内存*@paramp三级指针指向二级指针内存,目的是为了将二级指针置空*@paramcount二级指针指向的一级指针个数*/voidfree_memory(char***str,intcount)//循环控制变量inti=0;... 查看详情
c语言二级指针作为输入(自定义二级指针内存|二级指针排序|通过交换指针方式进行排序)(代码片段)
...排序(通过交换指针方式进行排序)在上一篇博客【C语言】二级指针作为输入(二维指针|为二维指针分配内存-存放一维指针|为每个一维指针分配内存|释放二维指针内存)基础上,对二维指针指向的若干一维指针指向的数据进行排序;... 查看详情
一级指针与二级指针(代码片段)
文章目录一级指针二级指针小结一级指针改变指针所指向的内容,二级指针改变一级指针的内容(即,改变一级指针变量所存储的地址)一级指针地址传参,指针变量接受该地址,指针解引用,代表所... 查看详情
c拾遗-二级指针数组内函数(代码片段)
1、c语言中二级指针用途1:一般被用在多维数组的环境中,一个二级指针可以指向一个二维数组;用途2:二级指针作为函数参数使用时,可以通过函数修改实参指针值的目的。对于第二点用途的理解:c语... 查看详情
c拾遗-二级指针数组内函数(代码片段)
1、c语言中二级指针用途1:一般被用在多维数组的环境中,一个二级指针可以指向一个二维数组;用途2:二级指针作为函数参数使用时,可以通过函数修改实参指针值的目的。对于第二点用途的理解:c语... 查看详情
c语言多级指针(在函数中生成二级指针|通过传入的三级指针进行间接赋值)(代码片段)
文章目录前言一、在函数中生成二级指针(通过传入的三级指针进行间接赋值)二、完整代码示例前言如果要通过函数形参间接赋值修改nnn级指针,需要向函数中传入n+1n+1n+1级指针形参;一、在函数中生成二级指针(通过传入... 查看详情
使用二级指针修改带const的只读变量(代码片段)
使用二级指针修改带const的只读变量修饰词带const的常量一般是作为只读变量,不容易被改变其赋值,但是使用二级指针可以改修初始值虽然编译有报警提示,但是还是可以编译通过的。#include<stdio.h>intmain()constintn... 查看详情
c语言二级指针作为输入(自定义二级指针内存|二级指针排序|通过交换指针指向的内存数据方式进行排序)(代码片段)
...针指向的内存数据方式进行排序)在上一篇博客【C语言】二级指针作为输入(二维指针|为二维指针分配内存-存放一维指针|为每个一维指针分配内存|释放二维指针内存)基础上,对二维指针指向的若干一维指针指向的数据进行排序;... 查看详情
c语言提高:二级指针的输入输出(代码片段)
文章目录题目代码解析1.二级指针的输入输出2.内存模型图题目现有三个字符串“aaaaa”,“bbbbb”,“ccccc”,要求实现一个函数(接口)把这三个字符串拼接成一个字符串。代码#include"stdio.h"#include"st... 查看详情