【原创】浅谈指针(十)链表的写法

2023-05-16

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

前言

最近我又来更新这个系列了,其实感觉指针对于我们还是非常重要的存在。指针之所以是初学者们的“噩梦”,它的难度源于它的灵活性。
这篇文章,我想要来写一下指针的实际运用,如果指针只是一些考试的考题,那就没有意义了。最重要的,指针在C语言,乃至C++,都是不可或缺的一部分。

链表的简单回顾

链表是一种数据结构。

对于一个链表来说,每个结点有两个域,即数据域和指针域,数据域是用来存放这个链表的数字,指针域用来存放下一个结点的地址。特别的,最后一个结点的指针域设为NULL。
这样,就不需要让整个链表顺序存储了。

对于数据的插入和删除操作,链表只需要新建结点即可:

插入和删除的时间复杂度是O(1),不需要移动元素。而对于普通的线性表,需要移动数据,因此时间复杂度为O(n)。

结构体声明

对于链表的结构体,我们可以这样写:

typedef struct List{
	int data;
	List *next;
	List(int x){
		this->data=x;
		next=NULL;
	}
};
List *lst;

data是数据域,next是指针域。

其中,List(x)是一个构造函数,这样在使用new进行结点分配的时候可以简便书写。分配的时候就需要这样写:

l=new List(x);

这个构造函数做了两件事:一个是把data进行赋值,一个是把next设为NULL。

补充1:this指针
其中,写this->data,this是指这个结构体本身,例如调用:

l=new List(x);

此时this就指向l。this是一个特殊的指针。有一种形象的比喻方式:

当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。
对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。

当然,这里不写this也是可以的。这只是写法问题。

补充2:->运算符
这个运算符,我们一般称为“箭头运算符”。
假设我们有现在下面的一个结构体:

struct info{
  string name;
  int age;
}

如果现在有一个普通变量x,那么引用其中的age,写作:x.age
如果现在有一个指针变量p,那么引用其中的age,要写作p->age
也就是说,对于一个指针结构体,引用其中的成员需要使用->运算符。
本质上,p->age等同于(*p).age,注意这里括号虽然麻烦但是不可省略。箭头运算符只是一种简便写法。

在链表的最后添加元素

我们知道,如果一个链表的当前结点为NULL,那么它必定是最后的结点。因此,我们可以采用递归的写法,如果链表当前节点不为NULL,那么就下一个结点。

void add(List *&l,int x){
	if(l==NULL){
		l=new List(x);
		return;
	}
	else add(l->next,x);
}

l=new List(x);,之前说过的构造函数写法。
add(l->next,x)表示找下一个结点。

补充3:*&是什么鬼!

我们知道,&是引用传递参数。我之前的浅谈指针(三)写过,网页链接

如果懒得在原文找的话,我这里直接把原文贴出来了:

在这里,*表示指针,&表示引用传递,那么加在一起就是指针的引用传递,虽然声明看上去很烦,但是理解了也就是这么回事。

输出链表的所有元素

毫无难度的函数,我直接贴出来了,逻辑和add函数类似。

void write(List *l){
	if(l==NULL)return;
	else{
		printf("%d ",l->data);
		write(l->next);
	}
}

插入元素

链表的灵活之处就是它的插入和删除函数。
如下图所示,我们要在2之后插入一个10:

首先,我们需要把10和3连接起来,否则一旦断掉2和3之间的连接,那么整个链表就直接分离了,无法再找到3的位置。

下一步,就是把2和10连接起来,同时断开2和3的连接。

这样就把插入的操作完成了,其实本质是很简单了。

void insert(int pos,List *&l,int x){
	if(pos==1){
		List *p=new List(x);
		p->next=l->next;
		l->next=p;
	}
	else insert(pos-1,l->next,x);
}

为了找到待插入的位置pos,我们可以采用递归的方法,每往后一个结点pos-1,最终当pos=1时就到了想要的位置。

删除元素

同样的链表,假设删除其中的3:

首先,先新建一个指针,指向3,否则后续操作过后就无法释放这块内存:

第二步,把2连接到4上面去。

最后,释放这个新建的指针,本质就是释放3。

代码还是一样,注意最终到pos=2就要停止了,这个算法无法删除首个结点的位置。

void remove(int pos,List *&l){
	if(pos==2){
		List *p=l->next;
		l->next=l->next->next;
		delete p;
	}
	else remove(pos-1,l->next);
}

完整思路

一套完整的链表写下来也是有四五十行代码的,完整代码如下:

#include
using namespace std;
typedef struct List{
	int data;
	List *next;
	List(int x){
		this->data=x;
		next=NULL;
	}
};
List *lst;
void add(List *&l,int x){
	if(l==NULL){
		l=new List(x);
		return;
	}
	else add(l->next,x);
}
void write(List *l){
	if(l==NULL)return;
	else{
		printf("%d ",l->data);
		write(l->next);
	}
}
void insert(int pos,List *&l,int x){
	if(pos==1){
		List *p=new List(x);
		p->next=l->next;
		l->next=p;
	}
	else insert(pos-1,l->next,x);
}
void remove(int pos,List *&l){
	if(pos==2){
		List *p=l->next;
		l->next=l->next->next;
		delete p;
	}
	else remove(pos-1,l->next);
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		add(lst,x);
	}
	while(m--){
		int k;
		scanf("%d",&k);
		if(k==1){//插入操作
			int pos,val;
			scanf("%d%d",&pos,&val);
			insert(pos,lst,val);
			write(lst);putchar('\n');
		}
		else if(k==2){//删除操作
			int pos;
			scanf("%d",&pos);
			remove(pos,lst);
			write(lst);putchar('\n');
		}
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【原创】浅谈指针(十)链表的写法 的相关文章

  • CubeMX配合PlatformIO开发STM32(STorM32),配置双MPU6050(板载与外置),并使用gui显示数据

    本人使用的设备 驱动 xff1a Windows10串口助手 4 3 25 其实啥都行 桃饱随处可买的usb ttl xff08 ch340G xff09 桃饱随处可买的stlinkmpu6050 xff08 一个板载 xff0c 一个通过
  • ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试

    节点间需要有数据交互 xff0c 而ros所要解决的问题就是数据该如何交互 一 通讯原理图 ros在设计Node间通讯机制的时候 xff0c 考虑的是很周全的 Publisher 发送消息的 xff0c Subscriber 接收消息的 T
  • 硬石开发板STM32F407IGT6 (HAL库)学习笔记

    硬石开发板STM32F407IGT6 xff08 HAL库 xff09 学习笔记 2020 06 21 2020 06 22 2020 06 23 2020 06 24 该笔记为学习时遇到的问题与解决方法等内容的记录 xff0c 可能有错
  • Ubuntu20/视觉SLAM十四讲踩坑记录

    Ubuntu 视觉SLAM十四讲踩坑记录 Ubuntu xff08 20 xff09 视觉SLAM十四讲踩坑记录 xff1a 共性问题 xff1a 1 安装OpenCV后 xff0c 例程仍无法找到OpenCV文件 ch3 visualiz
  • AMESim2020.1仿真编译失败解决方法之一

    AMESim2020 1仿真编译失败解决方法之一 问题描述 xff1a 软件安装正确 xff0c 在准备和matlab联合仿真时 xff0c 换用VC2015以上版本编译器编译失败 解决方法 xff1a 到AMESim安装路径下 xff0c
  • Linux/Ubuntu20.04下载安装Geant4及B1示例测试

    Linux Ubuntu20 04下载安装Geant4及B1示例测试 0 参考内容1 下载geant4软件包2 geant4安装准备内容3 geant4文件编译4 安装数据包4 1 安装方式14 2安装方式2 5 添加文件路径6 B1示例测
  • Ubuntu20.04进行CUDA11.0及对应CUDNN安装

    Ubuntu20 04进行CUDA11 0及对应CUDNN安装 xff1a 基本步骤 xff1a 1 安装nvidia显卡驱动 可直接通过 xff1a 软件和更新 gt 附加驱动 选择满足CUDA版本的nvidia专有驱动 gt 应用更改
  • git分离头指针处理

    文章目录 1 什么是git分离头指针2 将git 分离头指针所指向的代码 xff08 commit id xff09 保存下来总结 本文将主要介绍一下git分离头指针状态 xff0c 并记录如何将分离头指针状态的代码合并到分支中 1 什么是
  • Docker使用系列——Docker安装(Ubuntu20.04)

    Docker使用系列 Docker安装 xff08 Ubuntu20 04 xff09 卸载安装测试问题 直接按官方安装教程即可 xff1a Install Docker Engine on Ubuntu 卸载 安装过老版本的Docker则
  • Docker使用系列——生成一个Ubuntu20.04+Pyqt5的容器

    由于在自己的电脑中安装Pyqt5不成功 xff0c 原因是与其他环境中的qt版本不兼容 因此 xff0c 了解到了docker xff0c 这里记录一下在docker中安装pyqt5过程 1 安装Docker并从官方仓库拉取Ubuntu 2
  • C语言实现链表(链式存储结构)

    链表 xff08 链式存储结构 xff09 及创建 链表 xff0c 别名链式存储结构或单链表 xff0c 用于存储逻辑关系为 一对一 的数据 与顺序表不同 xff0c 链表不限制数据的物理存储状态 xff0c 换句话说 xff0c 使用链
  • cmake与make的区别及CMakeLists.txt文件编写

    一 cmake与make的区别 make工具是一个自动化编译工具 xff0c 它会根据Makefile中的规则进行批处理编译 当需要编译的文件较多时 xff0c 使用make工具会大大提高效率 但是 xff0c 当项目较大时 xff0c 编
  • 接口测试学习必看 - 实现简易接口测试

    前言 终于整理到了接口测试部分的内容 xff0c 接口测试可以说是软件测试入门到初级软件测试的一个必备进阶技巧 很多挂着 灰盒测试 的标识 xff0c 其实就是对接口测试的另外一层理解 何为 灰盒 xff0c 能够看到一部分本质的东西 xf
  • roscpp 底层通讯协议更改

    ROS为机器人开发者们提供了不同语言的编程接口 xff0c 其中C 43 43 接口叫做roscpp xff0c 用来创建topic service param xff0c 实现ROS的通信功能 roscpp is a C 43 43 im
  • c++学习心得:STL初学(基础篇)

    标准函数库 xff08 STL xff09 学习心得 基础篇 STL主要由两种组件构成 xff1a 一是容器 xff0c 包括vector list set map等类 xff1b 另一种组件是用以操作这些容器的所谓的泛型算法包括find
  • STM32 LoRa无线数传模块 PC通过串口传输数据到单片机

    STM32 PC通过串口助手无线传输数据到单片机 之前学习了STM32单片机 xff0c 使用正点原子的精英板 两个TTL 转LoRa 半双工无线数传模块 xff0c 通过PC机串口助手 xff0c 向32单片机传输数据 xff0c 接收数
  • 如何使用 datax 将 mysql 中的数据拉取到 hive ?

    需求 使用datax将mysql中的数据拉取到hive的ods层 步骤 首先在mysql中确定好需要拉取的表user extend xff0c 然后对应在hive中创建好空表 xff0c 等待拉取 这里对应创建的hive表格如下 CREAT
  • C语言实现TCP客户端、服务器

    服务器 include lt stdio h gt include lt sys socket h gt include lt netinet in h gt include lt arpa inet h gt include 34 str
  • 树莓派控制无人机实现定点降落(概述目录)

    最近在做一个无人机与车协同的项目 xff0c 无人机需要比较准确地落到车的平台上 xff0c 而且因为经费较少只能用树莓派 xff0c 我的思路以及在调试过程中遇到的问题 xff0c 将公布在我接下来的博文里 这里列个目录 xff1a 树莓

随机推荐

  • C语言字符串常用函数总结(持续更新)

    最近在重温C语言的一些基础知识 xff0c 感觉C语言字符串操作还是比较难的 xff0c 在学习的过程中总结了一些常用的字符串相关函数 xff0c 包括C语言字符串输入 字符串输入 计算字符串长度 字符串赋值 字符串分割 字符串拼接 字符串
  • git tag和branch的关系

    tag类似于从commit发展出来的一个可写的玩具分支 它和branch很像 xff0c 但是可以快速取消所有修改 更多是用于快照查看的 如果它基于的commit被ammend变化了 xff0c 他俩的commit id 就会不一样了 xf
  • git命令之分支管理和Tag标签

    x1f4dd 个人简介 个人主页 xff1a 我是段段 x1f64b x1f34a 博客领域 xff1a 编程基础 前端 x1f4bb x1f345 写作风格 xff1a 干货 xff01 干货 xff01 都是干货 xff01 x1f35
  • 4个方面轻松搞定进度条

    不管是在APP还是PC xff0c 不管是Loading页 xff0c 还是在音乐播放器中 xff0c 进度条的运用都非常广泛 xff0c 形式也多种多样 xff0c 让人眼花缭乱 做为一个交互设计新手 xff0c 项目中也经常碰到进度条设
  • Ubuntu18.04安装ROS初始化rosdep阶段报错的解决方案

    在运行rosdep update时出现 reading in sources list data from etc ros rosdep sources list d ERROR unable to process source https
  • 菜鸡的ROS学习笔记(image_transport)

    菜鸡的ROS学习笔记 xff08 image transport xff09 image transport 这一部分是搬运的ROS wiki中的介绍 xff0c 主要是image transport这个包的用法 xff0c 之后我会把它尽
  • MS5611气压计数据采集(模拟IIC)/温度采集/相对高度求解

    MS5611气压计数据采集 模拟IIC 温度采集 相对高度求解 1 MS5611气压计属性 1 1 基础属性 MS5611使用24位ADC 可以采集温度和气压 xff0c 并且温度可以用来补偿气压 xff0c MS5611在出厂时进行了校准
  • 嵌入式物联网【数据处理篇】C 语言char类型与int类型的转化

    char和int的转换有两种方式 这两种方式适合于在输出时使用 最简单的方法就是利用ASSCII码的差值 直接用char的值减去 0 就行了 eg char nbsp a nbsp 9 int nbsp a a 0 另一个就是要利用c语言的
  • QT数据库:在QT中多线程访问mysql数据库的问题(已解决)

    一 可以便捷的使用多线程并发类QtConcurrent解决 关于类的使用请参考博客 便捷的使用多线程并发类QtConcurrent解决Qt在槽函数中执行耗时操作导致界面卡住的问题 吻等离子的博客 CSDN博客 二 出现问题 QT使用全局db
  • RS485、RS232、TTL的电平以及数据的收发

    目录 一 RS232 1 RS232标准接口定义 2 RS232串口线颜色定义 3 RS232串口接线方法 4 RS232的电平 二 RS485 xff08 基于MAX85的收发介绍 xff09 1 RS485标准接口定义 2 RS485串
  • 软件使用:如何彻底把VMware卸载干净

    1 禁用VM虚拟机服务 首先 xff0c 需要停止虚拟机VMware相关服务 按下快捷键WIN 43 R xff0c 打开windows运行对话框 xff0c 输入services msc 点击确定 在服务管理中 xff0c 找到VM开头的
  • Qt编译器MinGW和MSVC的区别

    一 两者的区别 1 MSVC 即Microsoft Visual C Compiler 即微软自己的编译器 我们下载Windows下的OpenCV时 解压后里面有两个文件夹 一个是build 一个是source build这个文件夹实际上是
  • Visual Studio快捷键(超全)

    目录 常用 xff1a 一 文件相关 二 编辑搜索相关 三 导航视图相关 四 项目相关 五 生成相关 六 调试相关 七 调试相关 八 分析相关 九 工具相关 十 扩展相关 十一 窗口相关 十二 帮助相关 常用 xff1a ctrl 43 x
  • 【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)

    一 安装与汉化 对版本没要求的可以直接选择 3 免安装的汉化包 1 下载安装MarkText MaxText win64 https github com marktext marktext releases download v0 17
  • 嵌入式【协议篇】CAN协议原理

    nbsp 一 CAN协议介绍 1 简介 CAN是控制器局域网络 Controller Area Network CAN 的简称 是一种能够实现分布式实时控制的串行通信网络 其实可以简单把CAN通信理解成开一场电话会议 当一个人讲话时其他人就
  • 曲阜师范大学831学姐高分背诵笔记(完整版)

    导论部分 1 微格教学 18 名词解释 答 微格教学称为 微型教学 xff0c 也称为 小型教学 所谓 微格教学 xff0c 就是将复杂的教学过程分解成许多容易掌握的具体的单一的技能 xff0c 如 导读技能 34 讲授技能 提问技能 等
  • STM32 【FreeRTOS HAL库】创建任务

    任务也不是很复杂的东西 简单得说 创建一个任务 你得提供它的执行函数 你得提供它的栈的大小 函数的执行空间 函数的优先级等重要的条件 因为任务在运行中 任务函数有调用关系 有局部变量 这些都保存在任务的栈里面 任务有可能被切换 有可能被暂停
  • 函数实现是否应该放在头文件

  • Microsoft Visual Studio C++2022 Windows 11 SDK环境

    Microsoft Visual Studio C 43 43 2022 Windows 11 SDK环境 1 安装2 环境变量本文为作者 难拳 原创 xff0c 转载请注明出处 1 安装 Visual Studio 2022适用于Wind
  • 【原创】浅谈指针(十)链表的写法

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 前言 最近我又