考研数据结构单链表的增删改查看这一篇就够了
目录
一. 单链表的特点
1.1 解引用拓展 🤖
二. 单链表的操作
2.1不带头节点的操作
2.1.1 打印
2.1.1.1 创建结点
2.1.2 尾插(需要二级指针)
注意形参的值不改变实参:(精髓部分)
2.1.3 头插
2.1.4 尾删
2.1.5 头删
2.1.6 在pos前插入
2.1.7 删除pos位置
一. 单链表的特点
单链表的结点是随机的不是逻辑上相邻即物理上相邻的。用指针指向下一个节点的地址。
1.1 解引用拓展 🤖
解引用有两种,* ->
*p的意思是:是取p所指向内存的值,取多少大小的值,取决于结构体前的数据类型,如int 取四个字节,char取一个字节。
p->的意思是: 结构体用->,取决于->后面是什么值,如果是->val则取data域的值,->next则 取下个结点的地址。相当于(*p).next
二. 单链表的操作
单链表分为带头结点和不带头结点 ☆*: .。. o(≧▽≦)o .。.:*☆
2.1不带头节点的操作
2.1.1 打印
打印不用二级指针的原因是:打印不用改变外部结构体指针,只用遍历打印就好了,当要改变结构体指针就要用二级指针。
void SLTPrint(SLNode* phead)
{SLNode* cur = phead;while (cur != NULL){printf("%d->", cur->val);cur = cur->next;}printf("NULL\n");
}
2.1.1.1 创建结点
SLNode* CreateNode(SLNDataType x)
{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->val = x;newnode->next = NULL;return newnode;
}
2.1.2 尾插(需要二级指针)

void SLTPushBack(SLNode** pphead, SLNDataType x)
{SLNode* newnode = CreateNode(x);if (*pphead == NULL){*pphead = newnode;}else{// 找尾SLNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}
}
注意形参的值不改变实参:(精髓部分)
接下来是很多人都迷迷糊糊搞不懂的地方。
当前函数定义的可以直接修改,不是当前当前函数定义的,无论是外部函数,还是malloc出来的空间,访问时都要用指针去通过地址修改。全局变量可以直接修改。

形参不不能改变实参的,要传实参的地址才能改变形参。
想用形参pphead改变外部指针phead(实参) ,先将实参的地址&plist,传给实参pphead,这时pphead代表的是plist地址(&plist),*pphead解引用所以*pphead代表是plist,这里是要改变SNode*,所以要node**。这里是要修改结构体的指针plist,所以是需要结构体指针的地址&plist传给*pphead。
如果要改变外部定义的结构指针SLNode*,要用二级指针SLNode**。
如果要改变外部定义的结构体Node,就要一级指针Node*。
2.1.3 头插

void SLTPushFront(SLNode** pphead, SLNDataType x)
{SLNode* newnode = CreateNode(x);newnode->next = *pphead;*pphead = newnode;
}
2.1.4 尾删
删后n-1个不需要二级指针,直接free();
但是只有一个空间的时候,删掉,plist就成了没有指向空间的野指针,所以需要将plist置空,需要改变结构体指针。

void SLTPopBack(SLNode** pphead)
{// 温柔的检查//if (*pphead == NULL)// return;// 空assert(*pphead);// 1、一个节点// 2、一个以上节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{// 找尾/*SLNode* prev = NULL;SLNode* tail = *pphead;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;*/SLNode* tail = *pphead;while (tail->next->next != NULL){tail = tail->next;}free(tail->next);tail->next = NULL;}
}
2.1.5 头删

void SLPopFront(SLNode** pphead) {assert(pphead);if ((*pphead)== NULL) {free(*pphead);*pphead= NULL;}else {/**pphead = (*pphead)->next;free(*pphead);*/SLNode* tmp = *pphead;*pphead = (*pphead)->next;free(tmp);}}
2.1.6 在pos前插入
2.1.7 删除pos位置
不带头结点的完整代码
//头文件SList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>typedef int SLDataType;
typedef struct SListNode {SLDataType val;struct SListNode* next;}SLNode;
void SLPrint(SLNode* phead);
void SLPushBack(SLNode** pphead, SLDataType x);
void SLPopBack(SLNode** pphead);
void SLPushFront(SLNode** pphead, SLDataType x);
void SLPopFront(SLNode** pphead);//SList.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"SList.h"
#include<assert.h>
//打印
void SLPrint(SLNode* phead) {assert(phead);while (phead!= NULL) {printf("%d->", phead->val);phead = phead->next;}printf("NULL\n");
}
//创建新节点SLNode* CreateNode(SLDataType x) {SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));while (newnode == NULL) {perror("malloc fail");exit(-1);}newnode->val = x;newnode->next = NULL;return newnode;}//尾插
void SLPushBack(SLNode** pphead, SLDataType x) {SLNode* newnode = CreateNode(x); //调用函数,实参没有数据类型if (*pphead == NULL) {*pphead = newnode;}else {SLNode* tail = *pphead;while (tail->next != NULL) {tail = tail->next;}newnode->next = NULL;tail->next = newnode;}}
//尾删
void SLPopBack(SLNode** pphead) {assert(*pphead);if ((*pphead)->next == NULL) {free(*pphead);*pphead = NULL;}else {SLNode* pre = NULL;SLNode* tail = *pphead;while (tail->next != NULL) {pre = tail;tail = tail->next;}free(tail);tail = NULL;pre->next = NULL;}}
//头插
void SLPushFront(SLNode** pphead, SLDataType x) {SLNode* newnode = CreateNode(x);/*if (*pphead == NULL) {*pphead = newnode;}*/ //可以不要newnode->next = *pphead;*pphead= newnode;
}
//头删
void SLPopFront(SLNode** pphead) {assert(pphead);if ((*pphead)== NULL) {free(*pphead);*pphead= NULL;}else {/**pphead = (*pphead)->next;free(*pphead);*/SLNode* tmp = *pphead;*pphead = (*pphead)->next;free(tmp);}}//Test.c 文件
#define _CRT_SECURE_NO_WARNINGS
#include"SList.h"void Test1() {SLNode* splist=NULL;SLPushBack(&splist, 1);SLPushBack(&splist, 2);SLPushBack(&splist, 3);SLPushBack(&splist, 4);SLPrint(splist);SLPopBack(&splist);SLPopBack(&splist);SLPrint(splist);SLPushFront(&splist, 1);SLPushFront(&splist, 2);SLPushFront(&splist, 3);SLPushFront(&splist, 4);SLPrint(splist);SLPopFront(&splist);SLPopFront(&splist);SLPrint(splist);
}
int main() {Test1();return 0;}
相关文章:
考研数据结构单链表的增删改查看这一篇就够了
目录 一. 单链表的特点 1.1 解引用拓展 🤖 二. 单链表的操作 2.1不带头节点的操作 2.1.1 打印 2.1.1.1 创建结点 2.1.2 尾插(需要二级指针) 注意形参的值不改变实参:(精髓部分) 2.1.3 头插 2.1.4…...
Windows查看端口占用情况
Windows如何查看端口占用情况 方法1. cmd命令行执行netstat命令,查看端口占用情况 netstat -ano 以上命令输出太多信息,不方便查看,通过如下命令搜索具体端口占用情况,例如:8080端口 netstat -ano | findstr "…...
Python:词法分析(行结构与显式、隐式行拼接)
相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 1、逻辑结构 一个Python程序由许多逻辑行组成,字面意义上的一行指的是末尾有换行符(\n),但在不同的情况下,行末尾的换行符(\n)可能有…...
前端Vue 结合xlxs库实现解析excel文件,并动态组装表头!
目录 1.前言2.数据定义3. 页面布局4.上传之前的事件5.解析excel文件,并组装系统表头与excel表头的对应关系6.下拉框改变事件 1.前言 最近有一个需求,就是用户可以任意导入一个自定义的excel文件,让用户可以自己选择,组装表头的对应关系&…...
RabbitMQ集群配置以及负载均衡配置
RabbitMQ集群配置以及负载均衡配置 环境配置集群配置安装rabbitmq启动rabbitmq开启远程登录添加用户并且授权用户添加数据存放目录和日志存放目录查看端口拷⻉erlang.cookie将mq-2、mq-3作为内存节点加⼊mq-1节点集群中查看集群状态添加一个新的队列 RabbitMq负载均衡配置-HAPr…...
Leetcode Hot100之六:42.接雨水
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 提示: n height.length 1 < n < 2 * 10^4 0 < height[i] < 10^5 思路 暴力循环: 原本的思路是左边界i从左到…...
electron 主进程 和 渲染进程通信 ipcRenderer 和 mainWindow.webContents
electron 开发时最麻烦就是electron版本和node版本的选择和正确安装 electron 用npm安装时太慢容易报错,建议用cnpm i 进行安装 注意最新版渲染进程使用node nodeIntegration: true, // 渲染进程可用node contextIsolation: false, // 这个值影响nodeIntegration是…...
关于VUE启动内存溢出
安装node v10.14.2 后 启动公司的VUE项目 使用命令npm run dev 命令 报错: <--- Last few GCs --->[20940:00000244699848E0] 215872 ms: Scavenge 1690.2 (1836.4) -> 1679.6 (1836.4) MB, 5.4 / 0.7 ms (average mu 0.266, current mu 0.253) a…...
HBase学习笔记(1)—— 知识点总结
目录 HBase概述 HBase 基本架构 HBase安装部署启动 HBase Shell HBase数据读写流程 HBase 优化 HBase概述 HBase是以 hdfs 为数据存储的,一种分布式、非关系型的、可扩展的 NoSQL 数据库 关系型数据库和非关系型数据库的区别: 关系型数据库和非关…...
【Linux】 awk命令使用
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 语法 awk [选项] [文件] awk [选项] [程序] [文件] awk命令 -Linux手…...
Sentinel网关限流
背景 在微服务架构下,每个服务的性能都不同,为避免出现流量洪峰将服务冲垮,需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具,社区活跃,功能也很全面,包含实时监控、流控、熔断等功能。…...
solidworks对电脑要求高吗?2023solidworks配置要求
solidworks对电脑要求高吗?SolidWorks是一款功能强大的三维CAD软件,对电脑配置有一定的要求。一般来说,运行SolidWorks需要的电脑配置包括较高的处理器性能、足够的内存和存储空间,以及一块性能良好的显卡。此外,对于大…...
搭建神经网络(torch.nn的用法)
零零碎碎总结了一些torch框架里面nn模块的用法,尤其是关于搭建神经网络的 nn.ModuleList nn.Module nn.Sequential nn.Linear nn.Dropout nn.Embedding nn.DataParallel() 将模型封装起来,便于在多个gpu上并行计算,训练或者推理 nn.…...
卡码网语言基础课 | 11. 句子缩写
目录 一、 字符串大小的比较 二、 ASCII码值 三、 基本框架代码 四、 解题思路 4.1 首字母问题 4.2 判定小写字母 4.3 小写字母转换为大写字母 五、空格判断 六、 代码模块化 6.1 满足的条件 6.2 代码完善 七、 题目解答 7.1 原始代码 7.2 改进代码 八、 拓展与…...
Surface RT 安装 Linux
零:起因 在家无事找出来一台老旧设备 Surface RT 一代的,系统最新是 Windows 8.1 arm版,应用商店都已经打不开了 虽说有破解方法,能运行些软件,但怎么说也不是任意安装,所以局限性还是相当的大࿰…...
C++中的函数重载:多功能而强大的特性
引言 函数重载是C编程语言中的一项强大特性,它允许在同一个作用域内定义多个同名函数,但这些函数在参数类型、个数或顺序上有所不同。本文将深入探讨函数重载的用法,以及它的优势和应用场景。 正文 在C中,函数重载是一项非常有…...
数据分析实战 | K-means算法——蛋白质消费特征分析
目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 编辑 八、模型评价 九、模型调参与预测 一、数据及分析对象 txt文件——“protein.txt”,主要记录了25个国家的9个属性,主…...
HTTP协议详解-下(Tomcat)
如何构造 HTTP 请求 对于 GET 请求 地址栏直接输入点击收藏夹html 里的 link script img a…form 标签 通过 form 标签构造GET请求 <body><!-- 表单标签, 允许用户和服务器之间交互数据 --><!-- 提交的数据报以键值对的结果来组织 --><form action&quo…...
acwing算法基础之搜索与图论--prim算法
目录 1 基础知识2 模板3 工程化 1 基础知识 朴素版prim算法的关键步骤: 初始化距离数组dist,将其内的所有元素都设为正无穷大。定义集合S,表示生成树。循环n次:找到不在集合S中且距离集合S最近的结点t,用它去更新剩余…...
Amazon EC2 Serial Console 现已在其他亚马逊云科技区域推出
即日起,交互式 EC2 Serial Console 现也在以下区域推出:中东(巴林)、亚太地区(雅加达)、非洲(开普敦)、中东(阿联酋)、亚太地区(香港)…...
保姆级教程:在QGroundControl地图上可视化无人机盘旋半径(从QML到C++数据流)
深度解析QGroundControl中无人机盘旋半径的动态可视化实现 在无人机地面站软件开发中,实时可视化飞行参数是一个关键但常被忽视的细节。以QGroundControl(QGC)为例,当操作者调整盘旋半径时,地图上的圆形标记需要即时响应变化——这看似简单的…...
Python新手必看:5分钟搞定BMI计算器(附完整代码及format函数详解)
Python新手实战:从零构建BMI计算器与字符串格式化深度解析 在编程学习的起步阶段,能够快速实现一个看得见、用得着的小工具,往往比学习抽象概念更能激发持续学习的动力。BMI(身体质量指数)计算器就是一个绝佳的练手项目…...
抖音合集批量下载终极指南:如何高效获取完整内容收藏
抖音合集批量下载终极指南:如何高效获取完整内容收藏 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...
Spring Boot项目实战:用RocksDB 6.10.2替代Redis做本地缓存(附完整代码)
Spring Boot项目实战:用RocksDB 6.10.2替代Redis做本地缓存(附完整代码) 在微服务架构中,缓存是提升系统性能的关键组件。传统方案多采用Redis等分布式缓存,但在某些场景下,嵌入式本地缓存反而能提供更优的…...
网盘直链下载助手:八大平台高速下载的专业解决方案
网盘直链下载助手:八大平台高速下载的专业解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...
MiniCPM-o-4.5-nvidia-FlagOS企业应用:制造业BOM图纸识别+物料说明生成系统
MiniCPM-o-4.5-nvidia-FlagOS企业应用:制造业BOM图纸识别物料说明生成系统 1. 引言:当图纸遇到AI,制造业的“说明书”难题迎刃而解 想象一下这个场景:一家制造工厂的工程师小王,正对着一份刚从供应商那里发来的复杂装…...
【紧急预警】AIAgent“隐性失效”正在蔓延!SITS2026定义4类伪可靠陷阱及实时检测方案
第一章:SITS2026总结:构建可靠AIAgent的关键要素 2026奇点智能技术大会(https://ml-summit.org) 构建可靠AI Agent并非仅依赖更大参数量或更强算力,而需在系统性工程层面筑牢四大支柱:可验证的推理链、受控的工具调用、上下文感知…...
YOLO12多尺度检测效果展示:同一图像不同分辨率输入结果对比图集
YOLO12多尺度检测效果展示:同一图像不同分辨率输入结果对比图集 1. 引言:为什么分辨率对目标检测如此重要? 想象一下,你用手机拍了一张远处的风景照,照片里有个很小的人影。当你把照片放大看时,这个人影可…...
Qt上位机软件License模块实战:从硬件绑定到安全交付
1. Qt上位机软件License模块开发概述 在工业控制、数据采集等领域,上位机软件通常需要部署到客户的特定硬件环境中。为了防止软件被随意复制和分发,开发者往往需要实现一套License授权机制。Qt作为跨平台的C框架,非常适合开发这类带有授权功能…...
YOLOv13镜像实战:快速检测图片中的物体,效果实测分享
YOLOv13镜像实战:快速检测图片中的物体,效果实测分享 1. 引言:YOLOv13带来的检测新体验 目标检测技术正在经历一场革命性的变革。作为YOLO系列的最新成员,YOLOv13凭借其创新的超图计算技术和全管道信息协同机制,在保…...
