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

[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 报错&#xff1a; ORA-12537: TNS:connection closed 检查用户属组&#xff1a; [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&#xff0c;中文名为广域网。 LAN全称是 Local Area Network&#xff0c;中文名为局域网。 1.2分层 ICP/IP协议族通常被认为是一个四层协议系统 分层协议应用层Telnet、FTP和e-mail运输层TCP和UDP网…...

【带源码】如何开发一个视频打赏,付费观看视频的系统?

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

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)

简介 也称发布订阅模式&#xff08;Publish/Subscribe&#xff09;&#xff0c;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新 UML图&#xff1a; 应用场景&#xff1a; 消息通知组件&#x…...

MySQL 主从复制部署(8.0)

什么是主从数据库 主从数据库是一种数据库架构模式&#xff0c;通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器&#xff1a; 1&#xff09;主数据库&#xff08;Master&#xff09;&#xff1a;主数据库是读写数据的主要数据库服务器。所有写操…...

大话设计模式——16.命令模式(Command Pattern)

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

react17+18 中 setState是同步还是异步更新

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

Unity框架,ET框架8.1版本的打包流程记录

目录 打包代码前置1.必须要安装Visusal Studio 2022的组件&#xff0c;如下图&#xff0c;必须都要进行安装&#xff0c;不然会在代码重构的时候报错&#xff0c;丢失SDK。Rider的版本必须2023及以上 步骤一、使用Rider编辑器打开项目后进行重构项目步骤二、使用HybirdCLR生成A…...

windows访问wsl中的docker

1、启动windows路由转发功能&#xff1a; 找到任务管理器 --》服务–》打开服务–》 ROUTing and Remote Access 2、关闭wsl中linux的防火墙 3、查看docker系统和linux系统的ip和网关 以下面为例 # docker系统 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu…...

golang主要优缺点

优点 1&#xff09;采用协程机制&#xff0c;可以很方便的支持高并发&#xff0c;性能还不错。 2&#xff09;非常易于使用&#xff0c;产出效率很高。 缺点 也是协程机制。程序中一切皆协程&#xff0c;并且自己做了协程调度机制&#xff0c;而不是传统的 线程机制。导致需…...

浅谈Redis和一些指令

浅浅谈一谈Redis的客户端 Redis客户端 Redis也是一个客户端/服务端结构的程序。 MySQL也是一个客户端/服务端结构的程序。 Redis的客户端也有多种形态 1.自带命令行客户端 redis-cli 2.图形化界面的客户端&#xff08;桌面程序&#xff0c;web程序&#xff09; 像这样的图形…...

AI大模型探索之路-应用篇1:Langchain框架概述—快速构建大模型应用

目录 一、什么是LangChain&#xff1f; 二、LangChain解决了哪些问题&#xff1f; 三、LangChain总体架构 四、代码实践样例 总结 一、什么是LangChain&#xff1f; 为大模型应用提供简便之道。 LangChain&#xff0c;专为构建庞大的语言模型应用程序设计的框架&#xff0…...

Google Chrome 常用设置

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

如何提高旋转花键运行稳定性?

现代化精密仪器设备中&#xff0c;精密仪器的稳定工作性能对于生产效率和产品质量至关重要&#xff0c;运行效率和精度是常见问题。旋转花键作为机械传动系统中的重要组成部分&#xff0c;其稳定性也是直接影响到机械装配的质量和使用寿命&#xff0c;那么我们应该如何提升旋转…...

每日一题 第八十七期 洛谷 [蓝桥杯 2018 省 AB] 全球变暖

[蓝桥杯 2018 省 AB] 全球变暖 题目描述 你有一张某海域 N N N \times N NN 像素的照片&#xff0c;. 表示海洋、 # 表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......其中 “上下左右” 四个方向上连在一起的一片陆地组…...

AI技术创业有哪些机会?

文章目录 ✍探索AI技术创业的机会与挑战&#x1f48e;引言&#x1f48e;AI技术的快速发展与应用&#x1f48e;&#x1f339;AI技术创业的机会与方向&#x1f339;1. 行业解决方案&#x1f339;2. 智能产品和服务&#x1f339;3. 教育和培训 &#x1f48e;AI技术创业的挑战与应对…...

TensorFlow学习之:基础概念和操作

TensorFlow简介 TensorFlow是一个开源的深度学习框架&#xff0c;由Google的研究团队Google Brain Team开发&#xff0c;并在2015年发布。它是基于DistBelief&#xff0c;Google之前的一个深度学习项目&#xff0c;但被重新设计以便更灵活、更强大、更适应于研究和生产。 历史…...

最新在线工具箱网站系统源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...