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

数据结构之链表

链表的数据结构,包括单链表和双向链表的概念、结构及实现。详细阐述了结点的组成、链表的性质、打印方法以及插入删除操作。对比了顺序表与链表的区别,并列举了单向/双向、带头/不带头、循环/不循环组合出的 8 种链表结构。适合学习 C 语言基础数据结构。

静心发布于 2026/3/27更新于 2026/10/25111 浏览
数据结构之链表

链表

1. 单链表

1.1 概念与结构

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

在这里插入图片描述

1.1.1 结点

结点的组成主要有两个部分:当前结点要保存的数据和保存下一个结点的地址(指针变量)。

1.1.2 链表的性质
  • 链式机构在逻辑上是连续的,在物理结构上不一定连续。
  • 结点一般是从堆上申请的。
  • 从堆上申请来的空间,每次申请的空间可能连续,可能不连续。
struct SlistNode {
    int data; // 结点数据
    struct SlistNode* next; // 指针变量用保存下一个结点的地址
};
1.1.3 链表的打印

给定的链表的结构,实现链表从头到尾的打印

void SLTPrint(SLTNode* phead) {
    SLTNode* pcur = phead;
    while (pcur) {
        printf("%d", pcur->data);
        pcur = pcur->next;
    }
    printf("\n");
}

1.2 实现单链表

typedef int SLTDataType;
typedef struct SListNode {
    SLTDataType data; // 结点数据
    struct SListNode* next; // 指针保存下一个结点的地址
} SLTNode;

void SLTPrint(SLTNode* phead); // 头部插入删除/尾部插入删除
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);
// 查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
// 在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
// 删除 pos 结点
void SLTErase(SLTNode** pphead, SLTNode* pos);
// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
// 删除 pos 之后的结点
void SLTEraseAfter(SLTNode* pos);
// 销毁链表
void SListDestroy(SLTNode** pphead);

1.3 链表的分类

链表的结构非常多样,以下情况组合起来就有 8 种链表结构:

  • 单向或者双向
  • 带头或不带头
  • 循环或不循环 (2 x 2 x 2)=8 种

2. 双向链表

2.1 概念与结构

在这里插入图片描述

2.2 实现双链表

typedef int LTDataType;
typedef struct ListNode {
    struct ListNode* next; // 指针保存下一个结点的地址
    struct ListNode* prev; // 指针保存前一个结点的地址
    LTDataType data;
} LTNode;

void LTInit(LTNode** pphead);
LTNode* LTInit();
void LTDestroy(LTNode* phead);
void LTPrint(LTNode* phead);
bool LTEmpty(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
// 在 pos 位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);
LTNode* LTFind(LTNode* phead, LTDataType x);

3. 顺序表与链表的分析

在这里插入图片描述

目录

  1. 链表
  2. 1. 单链表
  3. 1.1 概念与结构
  4. 1.1.1 结点
  5. 1.1.2 链表的性质
  6. 1.1.3 链表的打印
  7. 1.2 实现单链表
  8. 1.3 链表的分类
  9. 2. 双向链表
  10. 2.1 概念与结构
  11. 2.2 实现双链表
  12. 3. 顺序表与链表的分析

更多推荐文章

查看全部
  • Python 爬虫实战:音乐平台歌曲信息采集与处理
  • Vue 3 实战:10 个提升开发体验的核心技巧
  • GESP C++一级认证考点解析与备考策略
  • AI 编程实战:自动化生成、低代码与算法优化
  • Rust 与 WebAssembly 实战:浏览器与 Node.js 高性能应用
  • AI 视频生成模型构建与实战指南
  • C++ 相对运动动画实战:葫芦娃飞向太空
  • Hunyuan-MT-7B-WEBUI 部署与多语言翻译实测
  • Rust 异步编程实战:构建高性能网络应用
  • 上手 Trae AI:从安装到实际项目的踩坑与心得
  • DeepSeek 使用指南与高阶提示词技巧
  • 2024 年中国 AI 大模型场景应用趋势蓝皮书
  • Flutter 三方库 bavard 的鸿蒙化适配指南:语义化聊天协议与机器人逻辑
  • Android 架构演进:MVC、MVP 与 MVVM 深度解析
  • Ollama 本地 AI 大模型部署完整教程
  • C++ 基础进阶:内存开辟规则与类型转换原理
  • AI Skills 重构前端开发工作流:元编程时代
  • Vue 3 实战:computed 与 watch 的区别及应用场景
  • WebMCP:浏览器 AI 交互新范式
  • 自然语言处理在医疗健康领域的应用与实战

相关免费在线工具

  • 加密/解密文本

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