最近偶尔看到一篇关于Linus Torvalds的访问,大神说大部分人都不理解指针。假设被要求写一段链表删除节点的程序,大多数的做法都是跟踪两个指针,当前指针cur和其父节点pre,这种实现很容易理解,但是并没有用到指针的精髓。

Linus是怎么写的呢,且看源代码

//链表之two star programming
#include <stdio.h> typedef struct node
{
int value;
struct node *next;
}listNode; listNode *insert(listNode *head, int value)
{
listNode *newNode = new listNode;
newNode->value = value;
newNode->next = head;
return newNode;
} void erase(listNode **head_in, int value)
{
listNode **cur = head_in;
while (*cur)
{
listNode *p = *cur;
if (p->value == value)
{
*cur = p->next;
delete p;
}
else
{
cur = &(p->next);
}
}
//return head;
} void printList(listNode *head)
{
listNode *p = head;
while(p)
{
printf("%d ", p->value);
p = p->next;
}
printf("\n");
} int main()
{
listNode *head = NULL;
int select, a;
do
{
printf("请输入选择 1--插入, 2--删除, 3--输出,其他跳出\n");
scanf("%d", &select);
if(select == 1)
{
printf("输入将要插入的值, -1表示结束\n");
while(scanf("%d", &a), a != -1)
{
head = insert(head, a);
}
}
else if(select == 2)
{
printf("输入将要删除的值, -1表示结束\n");
while(scanf("%d", &a), a != -1)
{
erase(&head, a);
}
}
else if(select == 3)
{
printList(head);
}
else break; } while (1); getchar();
return 0;
}

运行结果

在链表的删除节点函数earse()中,并不是把头结点指针head作为参数传入,而是传入指针head的引用,小雨来分析一下运行过程,直接上图说明

    

  

可以看出cur的移动比较有意思,它是沿着节点之间的指针移动的,在这里,我们也可以把指针当成一种特殊的节点。

当然现在并不提倡这种编程风格,虽然看起来很简洁,但是太晦涩,不能让人一眼看懂,Linus说一般操作系统核心部分用这种方式。

最新文章

  1. SQL Server 链接服务器的安全
  2. Qt and C++ Reflection,利用Qt简化C++的反射实现
  3. 通过开户银行账号查询客商名称 sql
  4. HDU1054 Strategic Game——匈牙利算法
  5. jsoup解析HTML
  6. 关于uboot中tftp上传内存数据到tftp服务器
  7. Maven的Dependency怎么找?
  8. [转]让你提升命令行效率的 Bash 快捷键
  9. Maven 打包可运行 jar
  10. android 利用Bitmap获取圆角矩形、圆形图片
  11. GetCursorPos/WindowFromPoint/SendMessage
  12. gridView自己定义做时间排版
  13. BUAA-OO第一单元小结
  14. Vipe-技术选型
  15. apache php mysql 安装
  16. CF 1131C Birthday
  17. 如何下载网易云音乐APP里的MV和短视频?
  18. .net core创建项目(指令方式)
  19. java项目打成jar包使用
  20. 奔跑吧vivado

热门文章

  1. ballerina 学习五 使用composer管理ballerina 项目
  2. Linux VPS上DenyHosts阻止SSH暴力攻击
  3. 13.Python接口自动化测试 -- 豆瓣
  4. Regexper:牛逼的 JavaScript 正则可视化工具
  5. RK3288 error: undefined reference to &#39;LOGD&#39;
  6. pheanstalk put 延时队列
  7. STM32启动过程解读与跟踪验证
  8. ubuntu 安装Eigen
  9. 杂项-数学软件:Mathematica
  10. crontab 定时任务设置