为什么无返回值的链表的插入操作头结点一定要用指向指针的指针

前言:

为什么链表的插入操作头结点一定要用指向指针的指针?之前自己对这个问题总是一知半解,今天终于花了点时间彻底搞懂了。

总的来说这样做的目的是为了应对“空链表”的情况。为了防止往一个空链表中插入一个结点时,新插入的结点那就是链表的头指针,这时如果链表的结点是一级指针的话,那么出了链表插入函数的作用域后,头结点又回到了原来的空值。

比如下面的一段程序

 1 // 链表的头指针为什么是指向指针的指针.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 using namespace std;
 7 
 8 struct Link
 9 {
10     int data;
11     Link * next;
12 };
13 void insert(Link *Phead,int data)
14 {
15     Link *pnew=new Link();
16     pnew->data=data;
17     pnew->next=NULL;
18     if(Phead==NULL)
19     {
20         Phead=pnew;
21     }
22 }
23 int _tmain(int argc, _TCHAR* argv[])
24 {
25     Link *Phead=NULL;
26     insert(Phead,2);
27     cout<<Phead->data;
28     return 0;
29 }

这就是因为第20行直接将新节点的值赋值给Phead,导致出了insert函数后,Phead又变成了NULL结点,而没有达到想要的指向新结点的效果。所以要把Phead设置成二级指针来传递或者在子函数中返回值才可以。

如果还是不太明白的话,那就先看看“函数是按值传递”的这方面的东西,函数按值传递的时候会拷贝一份实参的副本到形参中,而不是直接把实参赋给形参的。

如果对上面红字还是不理解可以看下面程序

 1 // 为什么链表的插入操作头结点一定要用指向指针的指针_延续.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 using namespace std;
 7 void function(int p)
 8 {
 9     p=5;
10 }
11 
12 int _tmain(int argc, _TCHAR* argv[])
13 {
14     int p=2;
15     function(p);
16     cout<<p;
17     return 0;
18 }

运行结果将会是2,而不是5。但是如果将p改成*p来传输,然后子函数中*P=5,结果才会变成5.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码代码的陈同学

JVM 栈和栈帧

对于没有深度递归的函数来说,无需担心上篇文章中的算法。当知道正在处理数据集有限时,我会使用这种简单的基本递归形式。由于你并不知道在应用程序中会处理多少数据,因此...

78290
来自专栏Python爱好者

Python高效编程(五)

11230
来自专栏程序员宝库

了解 dubbo 序列化,从 bug 开始

首先交代背景,前几天遇到一个小bug,由于其他系统的一个DTO子类和父类有一个字段名重复了,所以导致我set的子类字段那边拿不到值。改起来很简单嘛,让对面把子类...

10530
来自专栏维C果糖

Guava 指南 之「前置条件」

前置条件 Guava 提供了很多用于进行前置条件检查的工具,我们强烈建议静态导入这些方法。 每个方法都用三种形式: 没有额外的参数。抛出的任何异常都没有错误信息...

21170
来自专栏积累沉淀

Java设计模式(二十一)----访问者模式

访问者模式 一、概述 1、定义 2、分派的概念 3、分派的类型 4、双重分派 二、结...

217100
来自专栏大内老A

关于CLR内存管理一些深层次的讨论[下篇]

《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域方...

21690
来自专栏黑泽君的专栏

【Java面试复习经典】传智播客Java就业班入学测试题及答案解析(2014年版)

39020
来自专栏拭心的安卓进阶之路

Java 集合源码解析(2):ListIterator

今天心情和股票一样红,还是学学 ListIterator 吧! ListIterator ? 根据官方文档介绍, ListIterator 有以下功能: 允许...

23190
来自专栏专注 Java 基础分享

深入理解循环队列----循环数组实现ArrayDeque

     我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势。此处我们将要介绍的循环队列其实...

32980
来自专栏码匠的流水账

聊聊storm trident的state

storm-2.0.0/storm-client/src/jvm/org/apache/storm/trident/state/StateType.java

24840

扫码关注云+社区

领取腾讯云代金券