当前位置: 首页 > news >正文

单链表详解

单链表

  • 一.概念
    • 二.一些类型的创建
    • 三.尾插
    • 四.头插
  • 五.头删尾删
  • 六.打印链表
  • 七.单链表查找,任意位置插入,任意位置删除
  • 八.源代码

一.概念

该篇链表博客是按照工程项目的格式来记录的,与平常的算法链表有些许不同,注意区分。

在这里插入图片描述

在这里插入图片描述

二.一些类型的创建

在这里插入图片描述

在这里插入图片描述

三.尾插

因为需要凭空插入一个数,所以我们肯定需要新开辟一个节点(newnode)来存放需要插入的数。之后我们需要找到原链表的尾部再将其插入就可以了。

这里尤其需要注意的一个点是:我们增加操作如果链表为空时需要改变头节点(phead),因为phead是一级指针,所以我们传参需要二级指针。

Test.c

在这里插入图片描述

SList.h
在这里插入图片描述

SList.c

在这里插入图片描述

四.头插

因为头插必定会改变头节点所以同样需要使用二级指针。同时让插入的节点变为头节点。

Test.c

在这里插入图片描述

SLIst.h

在这里插入图片描述

SList.c

在这里插入图片描述

五.头删尾删

SList.h

在这里插入图片描述

SList.c

尾删
在这里插入图片描述

头删

在这里插入图片描述

六.打印链表

SList.h

在这里插入图片描述

SList.c

在这里插入图片描述

七.单链表查找,任意位置插入,任意位置删除

SList.h

在这里插入图片描述

SLiist.c

查找

在这里插入图片描述

在pos位置前面插入

在这里插入图片描述

将pos位置删除

在这里插入图片描述

八.源代码

test.c

#include"SList.h"void TestList()
{SListNode* phead = NULL;//测试部分}int main()
{TestList();return 0;
}

SList.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>#define SLTDataType inttypedef struct {SLTDataType data;//这里将int类型替换成链表类型以符合工程书写习惯struct SListNode* next;
}SListNode;void SLPushBack(SListNode** phead,SLTDataType x);//尾插void SLPushFront(SListNode** phead, SLTDataType x);//头插void SLPopBack(SListNode** phead);//尾删void SLPopFront(SListNode** phead);//头删void SLPrint(SListNode* phead);//打印//查找
SListNode* SListFind(SListNode* phead, SLTDataType x);
void SListInsert(SListNode**pphead,SListNode* pos, SLTDataType x);//在pos位置前位置插入(注意pos是节点的指针)
void SListErase(SListNode**pphead,SListNode* pos);//删除pos位置

SList.c

#include"SList.h"void SLPushBack(SListNode** pphead, SLTDataType x)//尾插
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));//开辟新节点来存放插入的数if (newnode == NULL)//如果开辟失败则返回错误{perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;//初始化新节点if (*pphead == NULL)//注意*pphead就是phead{*pphead = newnode;}//如果链表里没有数直接插入数else{SListNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}//找到原链表尾部tail->next = newnode;//插入新节点}}void SLPushFront(SListNode** pphead, SLTDataType x)//头插
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));//开辟一个新节点if (newnode == NULL)//判断是否开辟成功{perror("malloc fail");}newnode->data = x;newnode->next = *pphead;//让新的节点指向原本的头节点*pphead = newnode;//让新节点成为头节点
}void SLPopBack(SListNode** pphead)//尾删
{assert(*pphead!=NULL);//断言链表不能为空//找尾if ((*pphead)->next == NULL)//如果链表只有一个数{free(*pphead);//直接释放头节点*pphead = NULL;}else{SListNode* tail = *pphead;SListNode* prev = NULL;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);//直接删掉tail节点tail = NULL;prev->next = NULL;}}void SLPopFront(SListNode** pphead)//头删
{assert(*pphead != NULL);//链表不能为空SListNode* first = *pphead;*pphead = first->next;//直接让头节点变为第二个数free(first);first = NULL;
}void SLPrint(SListNode* phead)//打印
{SListNode* start = phead;while (start != NULL){printf("%d ", start->data);start = start->next;}printf("NULL");
}SListNode* SListFind(SListNode* phead, SLTDataType x)//查找
{SListNode* cur = phead;while (cur->data != x&&cur!=NULL){cur = cur->next;}return cur;
}void SListInsert(SListNode**pphead,SListNode* pos, SLTDataType x)//任意位置插入
{if (pos == *pphead){SLPushFront(pphead,x);//头插}else{SListNode* pre = *pphead;while (pre->next != pos)//找到pos前面的位置{pre = pre->next;}SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));//开辟新节点newnode->data = x;newnode->next = pos;//初始化新节点pre->next = newnode;//将pos前一个位置连接到新节点上}
}void SListErase(SListNode** pphead, SListNode* pos)//任意位置删除
{if (pos == *pphead){SLPopFront(pphead);//头删 }else{SListNode* pre = *pphead;while (pre->next != pos)//找到pos前面的位置{pre = pre->next;}pre->next = pos->next;//删除free(pos);}
}

相关文章:

单链表详解

单链表一.概念二.一些类型的创建三.尾插四.头插五.头删尾删六.打印链表七.单链表查找,任意位置插入&#xff0c;任意位置删除八.源代码一.概念 该篇链表博客是按照工程项目的格式来记录的&#xff0c;与平常的算法链表有些许不同&#xff0c;注意区分。 二.一些类型的创建 三.尾…...

【AUTOSAR-CanNM】-3.1-如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

点击返回「《Autosar_BSW高阶配置》总目录」 案例背景(共5页精讲):该篇博文将告诉您: 如何让ECU发出的首帧/第一帧是网络管理NM报文/帧(Tx Nm报文先于Tx App应用报文发出) 目录 1 图解详述APP报文和NM报文是如何发送的...

html常用标签2和语法练习

目录 1.表单标签 form标签 input标签 选择框 复选框:checkbox 按钮框:button 文件选择框 多行编辑框:textarea 2.html语法练习 展示简历信息 填写简历信息 ​编辑 3.HTML特殊字符 1.表单标签 表单是让用户输入信息的重要途径 表单域:包含表单元素的区域,重点是form…...

【go语言之thrift协议三之client端分析】

go语言之thrift协议之client端分析runClientOpenprotocolFactory.GetProtocolhandleClientNewTStandardClientNewCalculatorClienthandleClient的具体实现上一篇文章分析了thrift协议server端的实现&#xff0c;这边还是基于官方的示例去分析。 import ("crypto/tls"…...

Codeforces Round #855 (Div. 3) A-E

传送门 A. Is It a Cat? 题意 给你一个只有英文字母的字符串&#xff0c;问你这个字符串是否由连续的’m’, ‘e’, ‘o’,‘w’,&#xff08;顺序不能改变&#xff09;构成&#xff0c;并且不区分大小写。 如&#xff1a; “meow”, “mmmEeOWww”, “MeOooOw” 是符合要求…...

3/3操作系统作业

目录 1.前趋图和程序执行 &#xff08;1&#xff09;前驱图 &#xff08;2&#xff09;程序的顺序执行 &#xff08;3&#xff09;程序的并发执行 2.进程的描述 &#xff08;1&#xff09;进程的定义与特征 ​编辑​编辑&#xff08;2&#xff09;进程控制块​编辑 &…...

「C/C++」 标准文件操作大全

一、设备文件&#xff08;运行程序时会默认打开这三个设备文件&#xff09; stdin&#xff1a;标准输入&#xff0c;默认为当前终端&#xff08;键盘&#xff09;&#xff0c;我们使用的scanf、getchar函数默认从此终端获得数据。stdout&#xff1a; 标准输出&#xff0c;默认…...

一款SAST工具需要支持多少种编译器呢?

除了Java语言&#xff0c;C#语言之外&#xff0c;C、C语言是编译器类型最多的编程语言&#xff0c;有几十种编译器&#xff0c;这些编译器方言为研发SAST工具带来了巨大的工作量&#xff0c;很多产品由于无法适配客户的编译器&#xff0c;导致无法检测。下面我们罗列一下国外和…...

jvm mat分析dump文件

jvm调优中&#xff0c;经常使用dump来分析是否存在大对象导致频繁full gc&#xff0c;以下为使用步骤&#xff1a; 一、获得服务进程 ps -ef | grep list-app | grep -v grep 二、生成dump文件 jmap -dump:formatb,filexxx.dump pid jmap -dump:filetest.hprof,formatb 3307…...

python16行代码获取原神全角色+全语音

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本来是不玩原神的&#xff0c;但是实在是经不住双重诱惑呀~ 毕竟谁能拒绝角色风景超级好看又可以爬树、炸鱼、壶里造房子、抓小动物、躲猫猫的游戏捏~ 今天点进官网~角色得配音让我沉陷其中&#xff0c;于是 我决定把他们爬…...

链接投票二维码制作制作投票链接视频选举投票制作

关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。我们现在要以“信赖挚友”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星投票”…...

HTTP 协议

HTTP&#xff08;hypertext transport Protocol&#xff09;&#xff1b;超文本传输协议&#xff0c;是浏览器与万维网服务器之间通信的规则。 规定了客户端与服务端之间互相发送内容的格式&#xff0c;客户端发给服务端的叫 请求协议&#xff0c;服务端返回给客户端的为 响应…...

公司新招了个人,一副毛头小子的样儿,哪想到是新一代卷王····

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是…...

TSDF学习记录

【唐宇迪】三维重建-TSDF通俗解读 人工智能入门教程 水泡动画模拟&#xff08;Marching Cubes&#xff09; - 算法小丑 - 博客园 (cnblogs.com) TSDF 流程分析 首先需要构建一大块空区域采用体素网格来存储该区域需要计算每个体素的TSDF值及其权重 原理简述 SDF值&#x…...

【Linux】孤儿进程

在Linux中&#xff0c;如果子进程运行时&#xff0c;父进程因为某些原因先行终止&#xff0c;就称该子进程为孤儿进程。 我们编写如下代码&#xff1a; 子进程一直在运行&#xff0c;父进程运行一段时间后自动终止。运行该程序观察现象&#xff1a; 最开始时&#xff0c;子进程…...

ChatGPT解答:python大批量读写ini文件时,性能很低,有什么解决方法吗,给出具体的思路和实例

ChatGPT解答&#xff1a; python大批量读写ini文件时&#xff0c;性能很低&#xff0c;有什么解决方法吗&#xff0c;给出具体的思路和实例 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). python大批量读写ini文件时&#xff0c;性能很低&#xff0c;有什么解决方法吗&…...

MySql主键id不推荐使用UUID

前言 昨天在某个技术群中&#xff0c;有个老哥发送了一个技术视频&#xff1a;讲的是一个毕业生面试被问&#xff0c;前后端的交互ID是使用自增的吗&#xff1f;为什么不使用UUID&#xff1f;最后的解释是说性能问题&#xff0c;这个引起了我的兴趣&#xff0c;查了一下资料总…...

密码算法(SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算)

文章目录SM1 对称密码SM2 椭圆曲线公钥密码算法SM3 杂凑算法SM4 对称算法同态加密密态计算和隐私计算安全多方计算技术安全多方计算的应用场景对称加密算法非对称加密算法&#xff08;公钥加密&#xff09;参考文章SM1、SM2、SM3和SM4 为了保障商用密码的安全性&#xff0c;国家…...

保险行业中【内容行政系统】模块功能的实现

以下是一个基本的保险行业中的内容行政系统功能模块&#xff0c;包括对保单、理赔等方面的处理&#xff1a; 创建保单表创建理赔表创建保单查询视图创建理赔查询视图创建新保单更新保单状态创建理赔更新理赔状态-- 创建保单表 CREATE TABLE policies ( policy_id NUMBER PRIM…...

C语言入门知识——(7)VS2022的C语言基础调试

1、什么是bug 这个故事很多人都知道 1947年9月9日&#xff1a;第一个“Bug”被发现的时候&#xff1a;“1949年9月9日&#xff0c;我们晚上调试机器的时候&#xff0c;开着的窗户没有纱窗&#xff0c;机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了&#xff0c;…...

数据库可视化开发工具内容介绍

在现代化办公环境中&#xff0c;数据管理的重要性不言而喻。对于企业来说&#xff0c;将企业内部的数据做好规划和管理&#xff0c;可以给企业提升办公协作效率&#xff0c;为企业高层做出正确的经营决策奠定基础。本文主要给大家介绍的是数据化可视化开发工具的内容&#xff0…...

坚如磐石:TiDB 基于时间点的恢复(PiTR)特性优化之路丨6.5 新特性解析

本文介绍了 TiDB 数据库的基于时间点的恢复&#xff08;PiTR&#xff09;特性&#xff0c;该特性允许用户将数据库恢复到特定时间点&#xff0c;从而避免丢失重要数据。文章首先介绍了 PiTR 技术的基本概念和工作原理&#xff0c;接着探讨了 TiDB 对 PiTR 的优化&#xff0c;包…...

【云原生】K8S中PV和PVC

前言 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。…...

24小时稳定性爆肝测试!国内外5款远程控制软件大盘点

本文目录前言一、ToDesk远程控制二、向日葵远程控制三、RayLink四、TeamViewer五、AnyDesk总结前言 不论你的职业是什么&#xff0c;从事互联网工作基本就离不开远程&#xff0c;从远程安装系统到远程搞设计&#xff0c;再到做服务器的调控&#xff0c;都需要靠远程来协助完成…...

【Java集合框架】篇三:List接口

1. List接口及主要实现类特点 List&#xff1a;有序、可重复&#xff08;“动态”数组&#xff09;&#xff1b;因而常常使用List替换数组&#xff0c;因为List 的容量是动态的。 ArrayList&#xff1a;底层使用Object[]存储 线程不安全&#xff0c;添加、查找效率高 LinkedL…...

【算法经典题集】二分(持续更新~~~)

&#x1f63d;PREFACE&#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐ 评论&#x1f4dd;&#x1f4e2;系列专栏&#xff1a;算法经典题集&#x1f50a;本专栏涉及到的知识点或者题目是算法专栏的补充与应用&#x1f4aa;种一棵树最好是十年前其次是现在二分整数二分机器人…...

【c++】2023杭州月薪个税计算(chatGPT帮忙加注释)

参考信息 杭州市的个人所得税起征点是每月5000元。 个人所得税税率标准&#xff1a; 1、工资范围在1-5000元之间的&#xff0c;包括5000元&#xff0c;适用个人所得税税率为0%; 2、工资范围在5000-8000元之间的&#xff0c;包括8000元&#xff0c;适用个人所得税税率为3%; 3、工…...

【TypeScript】的上手学习指南!

目录TS简介TypeScript是什么&#xff1f;为什么要推荐使用TypeScript生态支持安装TypeScriptTS简介 TypeScript是什么&#xff1f; TypeScript官网 简介&#xff1a;TypeScript是JavaScript类型的超集&#xff0c;它可以编译成纯JavaScript。TypeScript可以在任何浏览器、任何计…...

红黑树(Insert())

文章目录红黑树代码红黑树性质红黑树vsAVL树红黑树的实现Insert()情况一&#xff1a;如果我插入的新节点时红色的情况二&#xff1a;叔叔是黑色或者不存在情况三: cur红,p为红,g为黑,u不存在或者为黑-双旋检查erase()红黑树vsAVL树红黑树的应用&#xff1a;红黑树 二叉搜索树 …...

MOV指令使用

mov用于数据传送。之后分为目的操作数和源操作数&#xff0c;目的操作数必须是通用寄存器或者内存单元&#xff1a;源操作数可以是具有相同数据宽度的通用寄存器或者内存单元&#xff0c;还可以是立即数。传送指令只影响目的操作数内容&#xff0c;不改变源操作数内容。 如&am…...

做快三网站/竞价推广是做什么的

第 2 部分 - 对 Android 应用程序包进行签名 ✏️ 在 GitHub 上编辑 可离线查看的 PDF下载 PDF 本指南介绍如何对 Android 应用程序包进行签名。 如果使用较旧版本的 Xamarin Studio&#xff08;版本 5.9 之前&#xff09;&#xff0c;请参阅 Xamarin Studio 5.8 及更低版…...

wordpress 做论坛/百度刷自己网站的关键词

我试图写出一些文本&#xff0c;并在可能的情况下将其编码为utf-8&#xff0c;使用以下代码&#xff1a;outf.write((lang_name "," (script_name or "") "\n").encode("utf-8", errorsreplace))我得到以下错误&#xff1a;^{pr2}$…...

wordpress插件选项/百度推广客户端怎么登陆

Stack继承Vector类&#xff0c;它通过五个操作对类 Vector 进行了扩展。 栈是 后进先出的。 栈提供了通常的 push 和 pop 操作&#xff0c;以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。 方法摘要 booleanemp…...

godaddy如何创建网站/最大免费广告发布平台

选课系统6. 创建数据库创建数据库设置编码为UTF8CREATE DATABASE choose CHARSET utf8;6.1 创建班级表表名:classes字段:class_no 整型 自增长 主键 -- 班级编号class_name char(20) 非空 唯一 -- 班级名称department_name char(20) 非空 -- 院系名称create tableclasses(cl…...

做网站毕业设计/微信推广软件哪个好

1、下载android源码2、在linux下生成android.ipr等执行下面的命令即可生成android.ipr等文件&#xff1a;cd &#xff5e;/aosp //具体的源码根目录source build/envsetup.sh //用于初始化环境变量mmm development/tools/idegen/ //生成文件out/host/linux-x86/framework/idege…...

织梦可以做论坛网站/浙江专业网站seo

less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注) 由于不管怎么输入都会被过滤&#xff0c;返回同一个结果&#xff0c; 所以只能用时间延迟注入 开始注入 ?id1and sleep(3) --此时注入成功 开始爆库 ?id1’ and if(length(database())4 , sle…...