为什么无返回值的链表的插入操作头结点一定要用指向指针的指针
时间:2022-04-26
本文章向大家介绍为什么无返回值的链表的插入操作头结点一定要用指向指针的指针,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言:
为什么链表的插入操作头结点一定要用指向指针的指针?之前自己对这个问题总是一知半解,今天终于花了点时间彻底搞懂了。
总的来说这样做的目的是为了应对“空链表”的情况。为了防止往一个空链表中插入一个结点时,新插入的结点那就是链表的头指针,这时如果链表的结点是一级指针的话,那么出了链表插入函数的作用域后,头结点又回到了原来的空值。
比如下面的一段程序
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.
- 《机器学习实战》学习笔记(十一):线性回归基础篇之预测鲍鱼年龄
- 你必须要知道CNN模型:ResNet
- CNN模型之SqueezeNet
- YOLO算法的原理与实现
- Batchnorm原理详解
- 【动手实践】Oracle 12.2 新特性:自动的列表分区创建
- AI从业者搞懂---这10种深度学习方法---老婆孩子热炕头
- OpenCV从零基础---检测及分割图像的目标区域
- Spark资源调优
- Tensorflow实战:Discuz验证码识别
- 【动手实践】:Lockdown Profile 的多租户权限控制
- 异步的JavaScript和XML(AJAX)
- JavaScript实现登录注册验证
- jQuery右侧滑动快速导航条
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何使用docker搭建PHP环境
- Go语言入门(四)Map&函数
- 一天一大 leet(每日温度)难度:中等 DAY-11
- Go语言入门(五)结构体&练习
- 利用hexo和github或coding 搭免费个人博客
- window 指令之 tree
- Go语言入门(六)结构体后续&指针
- 一天一大 leet(二叉树的序列化与反序列化)难度:困难 DAY-16
- 一天一大 leet(三数之和)难度:中等 DAY-12
- MongoDB Docker版本:基础入门和复制集
- Django连接MySql使用models处理数据
- 一天一大 leet(爬楼梯)难度:简单 DAY-13
- 一天一大 leet(最长公共前缀)难度:简单 DAY-15
- Go语言入门(七)goroutine和channel
- 一天一大 leet(从先序遍历还原二叉树)难度:困难 DAY-18