跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

数据结构入门:C 语言单链表实现

对比了顺序表的不足,引入链表概念。详细讲解链表的结构定义及节点组成,并通过 C 语言代码演示了单链表的核心操作,包括创建、打印、尾插、头插、尾删、头删、查找、指定位置插入与删除以及销毁。重点阐述了二级指针的使用和内存管理注意事项。

狂少发布于 2026/3/27更新于 2026/10/26103 浏览
数据结构入门:C 语言单链表实现

一、顺序表的问题及思考

在顺序表的实现中,可以发现以下问题:

  1. 中间/头部插入删除:时间复杂度为 O(N),效率低下。
  2. 增容消耗:需要申请新空间,拷贝数据,释放旧空间(realloc),导致运行速度下降。
  3. 空间浪费:增容一般是呈 2 倍的增长,势必会有一定的空间浪费。

为了应对以上问题,引入了链表的概念。

二、链表的概念及结构

1. 概念

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表是线性表的一种。

类比:火车由一节节车厢连接而成,物理上不连续,但逻辑上可通过前一节找到后一节。链表同理。

2. 结构

链表由一个个节点组成,每个节点包含数据 data 和指向下一个节点的指针。

文章配图

定义如下:

文章配图

底层为结构体。S 代表 Single(单个),node 是节点的意思。typedef 用于重定义链表的名字。

三、链表的实现

1. 头文件声明及定义

创建 .h 文件完成函数声明,.c 文件完成实现及测试。链表支持'增删查改'功能。

文章配图

参数说明:pos 表示指向指定位置的指针,phead 表示链表头节点的指针,pphead 表示头节点指针的地址(二级指针)。

2. 函数实现及测试

打印函数

传链表头节点的地址(传址调用)。创建 pcur 指针遍历链表,当 pcur 为空时结束,打印 NULL。

文章配图

节点申请函数

封装函数申请新节点,返回 SLTNode*。使用 malloc 开辟空间,若失败则 perror 并 exit。成功则置入值 x,next 置空,返回 newnode。

文章配图

尾插函数

思想:遍历链表找到尾节点,将新节点与尾节点相连。

  1. assert 断言 pphead,申请新节点。
  2. 判断链表是否为空,为空则插入头节点处。
  3. 不为空则遍历,将 newnode 赋给尾节点的 next 指针。

文章配图 文章配图

测试显示成功尾插 1、2 两个数据。

头插函数
  1. assert 断言 pphead。
  2. 申请新节点,让新节点的 next 指针指向头节点。
  3. 让头节点地址变成 newnode(需二级指针)。

文章配图

测试显示在原链表基础上头插了 3、4 这两个值。

尾删功能
  1. assert pphead 不能为空且 *pphead 不能为空。
  2. 判断节点数目:
    • 只有一个节点:free 释放头节点并置为空。
    • 多个节点:遍历找到尾节点 ptail 和前一个节点 prev,free 释放尾节点,prev->next 置为空。

文章配图

测试显示尾部 1、2 被删除。

头删功能
  1. 断言。
  2. 将头节点的 next 指针存入新创建的 next 指针中,让新的头节点指向 next。

文章配图

测试成功头删 4。

查找功能
  1. 创建指针 pcur 指向头节点(不修改原头节点)。
  2. 遍历,找到与 x 相等 data 并返回该指针,未找到返回 NULL。

文章配图

测试成功。

指定位置之前插入
  1. 断言。
  2. 若 pos 等于头节点位置,直接调用头插函数。
  3. 否则遍历找到 pos 之前的节点 prev,让 prev->next 指向 newnode,newnode->next 指向 pos。

文章配图 文章配图

测试通过。

指定位置之后插入
  1. 创建新节点 pos,让 pos->next 赋给 newnode->next。
  2. 再将 newnode 赋给 pos->next。

文章配图

测试通过。

删除 pos 处节点
  1. 断言 pphead、*pphead、pos 不为空。
  2. 若 pos 等于 *pphead,调用头删函数。
  3. 否则创建 prev 找到 pos 前一个节点,将 pos->next 赋值给 prev->next,free 释放 pos,并将 pos 置为空防止野指针。

文章配图

测试通过。

删除 pos 之后的节点
  1. 断言 pos 和 pos->next 不为空。
  2. 创建 del 指针保存 pos->next。
  3. 将 pos->next 指向 del->next,free 释放 del 并置空。

文章配图

测试通过。

链表销毁
  1. 函数 SListDestroy,断言 pphead 和 *phead 不为空。
  2. 创建 pcur 指向头节点,循环遍历,将 pcur->next 存入 next,free pcur,pcur=next。
  3. 直到 pcur 为空,将头节点地址置为 NULL。

文章配图

测试显示销毁成功,打印 NULL。

以上就是链表基本功能的实现。

目录

  1. 一、顺序表的问题及思考
  2. 二、链表的概念及结构
  3. 1. 概念
  4. 2. 结构
  5. 三、链表的实现
  6. 1. 头文件声明及定义
  7. 2. 函数实现及测试
  8. 打印函数
  9. 节点申请函数
  10. 尾插函数
  11. 头插函数
  12. 尾删功能
  13. 头删功能
  14. 查找功能
  15. 指定位置之前插入
  16. 指定位置之后插入
  17. 删除 pos 处节点
  18. 删除 pos 之后的节点
  19. 链表销毁

更多推荐文章

查看全部
  • MyBatis 扫描路径配置错误导致 Mapper 未找到问题排查
  • Claude Code 跨平台安装与配置指南(Windows/Linux/macOS)
  • Node.js 下载安装与环境配置全流程
  • Harness Engineering 深度解读:AI Agent 时代的缰绳与马鞍
  • VS Code 中 GitHub Copilot 安装后无法使用?关键配置步骤补全
  • Windows 下 Pandas 安装踩坑实录与最佳实践
  • Windows 下 Pandas 安装避坑指南:环境配置与版本选择
  • 消息队列理论基础与 Kafka 架构价值解析
  • 联想一体机安装 Linux 后报错 Error 1962 解决方案
  • Mac Mini 部署 OpenClaw 智能体实战指南
  • Microi 吾码低代码平台技术特性与跨数据库集成方案
  • 本地部署 ESPHome 智能家居方案及外网访问配置
  • Realistic Vision V2.0 超写实 AI 绘画使用指南
  • MC.JS WEBMC1.8 与传统 JavaScript 开发效率对比
  • Copilot 最佳使用方式与配置指南
  • OpenClaw 飞书机器人搭建流程
  • 文心一言开源模型部署与性能测评指南
  • 在 Windows 家庭版上安装 Docker 的实操记录
  • OpenClaw Skill:10 个提升 AI 模型能力的核心技能
  • Vivado 生成 MCS 文件并烧录 FLASH 实现 FPGA 掉电启动

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online