linus大神的二级指针(代码片段)

AlphaABCD AlphaABCD     2023-01-03     657

关键词:

普通人删除单向链表中的一个节点的时候都会这样写:

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... 查看详情