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

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

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

狂少发布于 2026/3/27更新于 2026/5/2327 浏览
数据结构入门: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. 链表销毁
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 从传统产品经理转型为 AI 产品经理的路径与方法
  • SheetJS:全场景适用的 JavaScript 电子表格处理工具
  • VS Code Copilot 实战指南:从安装到 Agent 模式应用
  • 智谱清影 2.0:AIGC 视频技术突破与产业价值解析
  • 基于 Docker 部署 Ollama 与 AnythingLLM 构建本地 LLM Agent
  • Ubuntu 24.04 安装 JDK 21 三种常用方法
  • Android Studio 结合 Trae 使用 Kotlin 开发 WebView 应用
  • ThyGPT 多模态大模型:甲状腺结节活检率降低 40%+ 研究解析
  • 基于 MCP Server - Figma AI Bridge 实现 Figma 设计稿前端代码自动化
  • 基于 DeepSeek 与 Cursor 构建智能代码审查工具实战
  • VGA、HDMI、TFT、LED 与显示器的关系解析
  • VSCode 中 GitHub Copilot 大模型体系、订阅策略与 Agent 机制
  • EhViewer 安卓开源漫画阅读器:安装与使用全指南
  • Neo4j Windows 环境搭建与安装指南
  • Stable Diffusion WebUI 本地安装与配置教程
  • Spring 日志模块 Spring-Jcl 详解与 Log4j 集成案例
  • 下班后适合的低门槛副业推荐与避坑建议
  • Python 开发 MongoDB 数据库 MCP Server 实战
  • 从 Copilot 到 Agentic:快手重构人 AI 流程研发铁三角实践
  • OpenClaw 爆火分析:AI Agent 如何从技术圈走向大众场景

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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