[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接口, 是一个多功能性工具程序,支持后台管理、上…...
Steam-Economy-Enhancer多货币支持:全球交易定价策略
Steam-Economy-Enhancer多货币支持:全球交易定价策略 【免费下载链接】Steam-Economy-Enhancer Enhances the Steam Inventory and Steam Market. 项目地址: https://gitcode.com/gh_mirrors/st/Steam-Economy-Enhancer Steam-Economy-Enhancer是一款强大的S…...
Word里MathType插件报错?别慌,手把手教你搞定MathPage.wll文件丢失问题
Word里MathType插件报错?三步精准定位MathPage.wll文件问题 当你正全神贯注地在Word中编辑数学公式,突然弹出一个刺眼的错误提示:"无法找到MathPage.wll文件"——这种突如其来的技术故障足以打断任何人的工作节奏。作为科研工作者、…...
5个PoE Overlay技巧:从新手到交易专家的快速升级指南
5个PoE Overlay技巧:从新手到交易专家的快速升级指南 【免费下载链接】PoE-Overlay An Overlay for Path of Exile. Built with Overwolf and Angular. 项目地址: https://gitcode.com/gh_mirrors/po/PoE-Overlay 你是否曾在《流放之路》中为装备价值判断而困…...
双喷头3D打印实战指南:从原理到应用,掌握多材料制造
1. 双喷头3D打印:从“炫技”到“实用”的跨越如果你玩3D打印有一段时间了,看着满柜子的单色模型,心里大概会开始痒痒:能不能打印个红蓝相间的超级英雄手办?或者做个硬塑料外壳配软胶按钮的遥控器?这种想法&…...
手把手教你用STC89C52单片机驱动DS1302时钟模块(附完整代码)
STC89C52与DS1302时钟模块实战指南:从硬件搭建到代码实现 1. 项目概述与硬件准备 在嵌入式系统开发中,实时时钟(RTC)功能是许多项目的核心需求。STC89C52作为经典的51系列单片机,与DS1302时钟模块的组合,为开发者提供了经济实惠且…...
Linux多网卡主机路由检查方法
Linux多网卡主机路由检查方法多网卡主机在 Linux 环境中并不少见。它们可能用于业务隔离、管理面分离、双线接入、内外网分流或高可用部署。但多网卡也意味着更复杂的路由行为。很多“这台机器能 ping 通但服务异常”“流量出去后回不来”的问题,最终都与路由选择有…...
宇视摄像机室外安装防腐说明
摄像机室外安装防腐说明一、开篇介绍防腐能力是户外摄像机长期稳定运行的关键。设备金属外壳一旦腐蚀,易引发起雾、进水、性能下降,严重时会导致整机损坏。宇视户外产品均按对应环境防护标准设计,可根据现场腐蚀等级选择适配产品。本文为工程…...
瑞为技术获IPO备案:年营收4.4亿 亏损6815万
雷递网 雷建平 5月15日厦门瑞为信息技术股份有限公司(简称“瑞为技术”)日前获IPO备案,拿到了上市钥匙。与瑞为技术一同拿到上市备案的公司还有上海仙工智能科技股份有限公司、江西齐云山食品股份有限公司、广东鼎泰高科技术股份有限公司。年…...
从需求到建表:我是如何用一张ER图搞定客户复杂业务逻辑的
从需求到建表:我是如何用一张ER图搞定客户复杂业务逻辑的 接手电商系统重构项目的第一天,客户甩过来二十多页需求文档和五张不同版本的Excel表。"这些数据都要关联起来",产品经理指着密密麻麻的字段说,"但具体怎么…...
如何高效配置阅读APP书源:完整指南助你轻松获取全网小说资源
如何高效配置阅读APP书源:完整指南助你轻松获取全网小说资源 【免费下载链接】Yuedu 📚「阅读」自用书源分享 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 还在为找不到心仪的小说而烦恼吗?想要打造属于自己的个性化阅读环境吗…...










