[C语言][数据结构][链表] 单链表的从零实现!
目录
零.必备知识
1.一级指针 && 二级指针
2. 节点的成员列表
a.数据
b.指向下一个节点的指针.
3. 动态内存空间的开辟 (malloc-calloc-realloc)
一.单链表的实现与销毁
1.1 节点的定义
1.2 单链表的尾插
1.3 单链表的头插
1.4 单链表的尾删
1.5 单链表的头删
1.6 单链表的查找
1.7 在指定位置之前插入数据
1.8 在指定位置之后插入数据
1.9 删除指定位置的数据
1.10 删除指定位置之后的数据
1.11 销毁单链表
二. 单链表源码
SingleList.h
SingleList.c
零.必备知识
1.一级指针 && 二级指针
2. 节点的成员列表
a.数据
b.指向下一个节点的指针.
3. 动态内存空间的开辟 (malloc-calloc-realloc)
一.单链表的实现与销毁
注:具体解释都在代码的注释中!(在代码中具体分析)
1.1 节点的定义
1.2 单链表的尾插
1.3 单链表的头插
1.4 单链表的尾删
1.5 单链表的头删
1.6 单链表的查找
1.7 在指定位置之前插入数据
1.8 在指定位置之后插入数据
1.9 删除指定位置的数据
1.10 删除指定位置之后的数据
1.11 销毁单链表
二. 单链表源码
SingleList.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>// 节点的定义
typedef int SLTDateType;
typedef struct SingleListNode
{SLTDateType date;struct SingleListNode* next;
}SLTNode;// 单链表的展示
void SLTPrint(SLTNode* phead);
// 单链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);
// 单链表的头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);
// 单链表的尾删
void SLTPopBack(SLTNode** pphead);
// 单链表的头删
void SLTPopFront(SLTNode** pphead);
// 单链表的查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x);
// 在指定位置之前插入数据
void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x);
// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x);
// 删除指定位置的数据
void SLTErase(SLTNode** pphead, SLTNode* pos);
// 删除指定位置之后的数据
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos);
// 销毁单链表
void SLTDestroy(SLTNode** pphead);
SingleList.c
#define _CRT_SECURE_NO_WARNINGS
#include "SingleList.h"
// 单链表的展示
void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead; //current 当前的,现在的 currect 正确的while (pcur != NULL) {printf("%d->", pcur->date);pcur = pcur->next;}printf("NULL\n");
}
// 节点的创造
SLTNode* SLTCreat(SLTDateType x)
{SLTNode* newNode = (SLTNode*)malloc(sizeof(SLTNode));if (newNode == NULL) {printf("创建失败!\n");exit(1);}newNode->date = x;newNode->next = NULL;return newNode;
}
// 单链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{assert(pphead);// 创建节点SLTNode* newNode = SLTCreat(x);// 没有节点if ((*pphead) == NULL) {(*pphead) = newNode;}else { // 有一个或多个节点SLTNode* pcur = (*pphead);while (pcur->next != NULL) {pcur = pcur->next;}pcur->next = newNode;}
}
// 单链表的头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{assert(pphead);SLTNode* pcur = (*pphead);// 创建节点SLTNode* newNode = SLTCreat(x);// 没有节点if ((*pphead) == NULL) {(*pphead) = newNode;}else { // 有一个或者多个节点newNode->next = (*pphead);(*pphead) = newNode;}
}
// 单链表的尾删
void SLTPopBack(SLTNode** pphead)
{assert(pphead && (*pphead));SLTNode* pcur = (*pphead);SLTNode* prev = (*pphead);// 只有一个节点if (pcur->next == NULL) {free(*pphead);(*pphead) = NULL;pcur = NULL;prev = NULL;}else { // 有多个节点while (pcur->next != NULL) {prev = pcur;pcur = pcur->next;}free(pcur);pcur = NULL;prev->next = NULL;}
}
// 单链表的头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead && (*pphead));SLTNode* pcur = (*pphead);// 只有一个节点if (pcur->next == NULL) {free(*pphead);(*pphead) = NULL;pcur = NULL;}else { //有多个节点(*pphead) = (*pphead)->next;free(pcur);pcur = NULL;}
}
// 单链表的查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x)
{SLTNode* pcur = phead;while (pcur != NULL) {if (pcur->date == x) {printf("找到了!\n");return pcur;}pcur = pcur->next;}printf("找不到!\n");return NULL;
}
// 在指定位置之前插入数据
void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{assert(pphead);SLTNode* pcur = (*pphead);// 创建节点SLTNode* newNode = SLTCreat(x);// 头插if (pos == (*pphead) || (*pphead) == NULL) {SLTPushFront(pphead, x);}else { //正常插入while (pcur->next != NULL) {if (pcur->next == pos) {newNode->next = pcur->next;pcur->next = newNode;break;}pcur = pcur->next;}}
}
// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{assert(pphead);// 创建节点SLTNode* newNode = SLTCreat(x);if ((*pphead) == NULL || pos == (*pphead)) {// 尾插SLTPushBack(pphead, x);}else { //正常插入SLTNode* pcur = (*pphead);while (pcur->next != NULL) {if (pcur == pos) {newNode->next = pcur->next;pcur->next = newNode;break;}pcur = pcur->next;}}
}
// 删除指定位置的数据
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && (*pphead));// 处理特殊情况(头删)if ((*pphead) == pos) {SLTPopFront(pphead);}else {SLTNode* prev = (*pphead);SLTNode* pcur = (*pphead);while (pcur != NULL) {if (pcur == pos) {prev->next = pcur->next;free(pcur);pcur = NULL;prev = NULL;break;}prev = pcur;pcur = pcur->next;}}
}
// 删除指定位置之后的数据
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos)
{assert(pphead && (*pphead));SLTNode* pcur = (*pphead);while (pcur->next != NULL) {if (pcur == pos) {SLTNode* tmp = pcur->next;pcur->next = pcur->next->next;free(tmp);tmp = NULL;break;}pcur = pcur->next;}
}
// 销毁单链表
void SLTDestroy(SLTNode** pphead)
{assert(pphead && (*pphead));SLTNode* pcur = (*pphead);SLTNode* prev = (*pphead);while (pcur != NULL) {prev = pcur;pcur = pcur->next;free(prev);}prev = NULL;(*pphead) = NULL;
}
相关文章:

[C语言][数据结构][链表] 单链表的从零实现!
目录 零.必备知识 1.一级指针 && 二级指针 2. 节点的成员列表 a.数据 b.指向下一个节点的指针. 3. 动态内存空间的开辟 (malloc-calloc-realloc) 一.单链表的实现与销毁 1.1 节点的定义 1.2 单链表的尾插 1.3 单链表的头插 1.4 单链表的尾删 1.5 单链表的头删 1…...
oracle rac打补丁后sqlplus / as sysdba ora-12537
sqlplus / as sysdba 报错: ORA-12537: TNS:connection closed 检查用户属组: [rootrac1 ~]# id oracle uid1102(oracle) gid1101(oinstall) groups1101(oinstall),1102(dba) [rootrac1 ~]# id grid uid1101(grid) gid1101(oinstall) groups1101(oin…...

TCP-IP详解卷一:协议——阅读总结
该内容适合程序员查看 第1章 概述 1.1 引言 WAN全称是 Wide Area Network,中文名为广域网。 LAN全称是 Local Area Network,中文名为局域网。 1.2分层 ICP/IP协议族通常被认为是一个四层协议系统 分层协议应用层Telnet、FTP和e-mail运输层TCP和UDP网…...

【带源码】如何开发一个视频打赏,付费观看视频的系统?
【带源码】如何开发一个视频打赏,付费观看视频的系统?开发指南来了 最近非常火爆的视频打赏系统,有用户端,管理端,代理端 风口来了,系统部署简单,需要详细部署教程的可以留下评论哦!…...

Linux--进程的概念(一)
目录 一、冯诺依曼体系结构二、操作系统2.1 什么是操作系统2.2 操作系统的意义 三、进程3.1 进程的基本概念3.2 描述进程——PCB3.3 进程和程序的区别3.4 task_struct-PCB的一种3.5 task_struct的内容分类 四、如何查看进程4.1 通过系统文件查看进程4.2 通过ps指令查看进程 五、…...

大话设计模式——15.观察者模式(Observer Pattern)
简介 也称发布订阅模式(Publish/Subscribe),定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 UML图: 应用场景: 消息通知组件&#x…...

MySQL 主从复制部署(8.0)
什么是主从数据库 主从数据库是一种数据库架构模式,通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器: 1)主数据库(Master):主数据库是读写数据的主要数据库服务器。所有写操…...

大话设计模式——16.命令模式(Command Pattern)
简介 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象进行执行。命令模式是一种特殊的策略模式,体现多个策略执行的问题,而不是选择的问题 UML图 应用场景 界面选择、键盘、按钮、事件操作都类似命令模式 …...

react17+18 中 setState是同步还是异步更新
在类组件中使用setState,在函数式组件中使用hooks的useState。 setstate目录 1. 类组件1.1 react 17版本1.2 react 18版本 2、函数式组件 1. 类组件 1.1 react 17版本 参考内容:第十一篇:setState 到底是同步的,还是异步的&…...

Unity框架,ET框架8.1版本的打包流程记录
目录 打包代码前置1.必须要安装Visusal Studio 2022的组件,如下图,必须都要进行安装,不然会在代码重构的时候报错,丢失SDK。Rider的版本必须2023及以上 步骤一、使用Rider编辑器打开项目后进行重构项目步骤二、使用HybirdCLR生成A…...
windows访问wsl中的docker
1、启动windows路由转发功能: 找到任务管理器 --》服务–》打开服务–》 ROUTing and Remote Access 2、关闭wsl中linux的防火墙 3、查看docker系统和linux系统的ip和网关 以下面为例 # docker系统 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu…...
golang主要优缺点
优点 1)采用协程机制,可以很方便的支持高并发,性能还不错。 2)非常易于使用,产出效率很高。 缺点 也是协程机制。程序中一切皆协程,并且自己做了协程调度机制,而不是传统的 线程机制。导致需…...

浅谈Redis和一些指令
浅浅谈一谈Redis的客户端 Redis客户端 Redis也是一个客户端/服务端结构的程序。 MySQL也是一个客户端/服务端结构的程序。 Redis的客户端也有多种形态 1.自带命令行客户端 redis-cli 2.图形化界面的客户端(桌面程序,web程序) 像这样的图形…...

AI大模型探索之路-应用篇1:Langchain框架概述—快速构建大模型应用
目录 一、什么是LangChain? 二、LangChain解决了哪些问题? 三、LangChain总体架构 四、代码实践样例 总结 一、什么是LangChain? 为大模型应用提供简便之道。 LangChain,专为构建庞大的语言模型应用程序设计的框架࿰…...

Google Chrome 常用设置
Google Chrome 常用设置 References 转至网页顶部 快捷键:Home 转至内容设置 chrome://settings/content 清除浏览数据 历史记录 -> 清除浏览数据 关于 Chrome 设置 -> 关于 Chrome chrome://settings/help References [1] Yongqiang Cheng, https:/…...

如何提高旋转花键运行稳定性?
现代化精密仪器设备中,精密仪器的稳定工作性能对于生产效率和产品质量至关重要,运行效率和精度是常见问题。旋转花键作为机械传动系统中的重要组成部分,其稳定性也是直接影响到机械装配的质量和使用寿命,那么我们应该如何提升旋转…...
每日一题 第八十七期 洛谷 [蓝桥杯 2018 省 AB] 全球变暖
[蓝桥杯 2018 省 AB] 全球变暖 题目描述 你有一张某海域 N N N \times N NN 像素的照片,. 表示海洋、 # 表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......其中 “上下左右” 四个方向上连在一起的一片陆地组…...
AI技术创业有哪些机会?
文章目录 ✍探索AI技术创业的机会与挑战💎引言💎AI技术的快速发展与应用💎🌹AI技术创业的机会与方向🌹1. 行业解决方案🌹2. 智能产品和服务🌹3. 教育和培训 💎AI技术创业的挑战与应对…...
TensorFlow学习之:基础概念和操作
TensorFlow简介 TensorFlow是一个开源的深度学习框架,由Google的研究团队Google Brain Team开发,并在2015年发布。它是基于DistBelief,Google之前的一个深度学习项目,但被重新设计以便更灵活、更强大、更适应于研究和生产。 历史…...

最新在线工具箱网站系统源码
内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API,同时还自带免费API接口, 是一个多功能性工具程序,支持后台管理、上…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...

SQLSERVER-DB操作记录
在SQL Server中,将查询结果放入一张新表可以通过几种方法实现。 方法1:使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构(包括列名和数据类型)将与查询结果匹配。 SELECT * INTO 新…...
Angular中Webpack与ngx-build-plus 浅学
Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具,用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中,Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...
Python打卡训练营学习记录Day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...