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

双向循环链表插入操作详解

双向循环链表插入操作详解。涵盖双向循环链表的基本结构定义,包括前驱和后继指针的作用。详细演示了头插法和尾插法的指针连接逻辑,提供了 C 语言代码实现,包含内存分配检查及空链表处理。通过分步解析指针赋值顺序,帮助理解如何维护链表的循环特性与完整性。

月亮邮递员发布于 2026/3/16更新于 2026/10/25103 浏览
双向循环链表插入操作详解

双向链表的实际应用

  • 虚拟滚动与长列表优化
  • 游戏开发与多媒体播放列表
  • 操作系统中的进程调度
  • 文本编辑器的'撤销'与'重做'
  • 浏览器历史记录

头文件定义 (list.h)

#ifndef __LIST_H_
#define __LIST_H_
#include <stdio.h>
#include <stdbool.h>
typedef struct Flight_List {
    int Flight_Number[10];
    char User_Name[2][3];
    struct Flight_List *Prev;
    struct Flight_List *Next;
} Flight_List;

Flight_List *List_Init();
Flight_List *List_Add(Flight_List *Head, int flightNumber, char *userName, bool determine);
Flight_List *List_Delete(Flight_List *Head, int Serial_Number);
Flight_List *List_Modify(Flight_List *Head, int Serial_Number, char *newUserName);
Flight_List *List_Find(Flight_List *Head, int Serial_Number);
#endif

实现细节 (list.c)

增加节点函数

Flight_List *List_Add(Flight_List *Head, int Flight_Number, char *Flight_Name, bool Determine) {
    Flight_List *Temporary_Node = (Flight_List*)malloc(sizeof(Flight_List));
    if (Temporary_Node == NULL) {
        printf("临时节点内存分配失败!\n");
        return Head;
    }
    Temporary_Node->Flight_Number[0] = Flight_Number;
    strcpy(Temporary_Node->User_Name[0], Flight_Name);

    if (Determine) { // 头插法
        if (Head == NULL) {
            Temporary_Node->Prev = Temporary_Node;
            Temporary_Node->Next = Temporary_Node;
            return Temporary_Node;
        } else {
            Flight_List *First_Node = Head->Next;
            Temporary_Node->Next = First_Node;
            First_Node->Prev = Temporary_Node;
            Head->Next = Temporary_Node;
            Temporary_Node->Prev = Head;
            return Temporary_Node;
        }
    } else { // 尾插法
        if (Head == NULL) {
            Temporary_Node->Prev = Temporary_Node;
            Temporary_Node->Next = Temporary_Node;
            return Temporary_Node;
        } else {
            Flight_List *Last_Node = Head->Prev;
            Last_Node->Next = Temporary_Node;
            Temporary_Node->Prev = Last_Node;
            Temporary_Node->Next = Head;
            Head->Prev = Temporary_Node;
            return Temporary_Node;
        }
    }
}

指针位置说明

  • 前驱指针 (Prev): 指向当前节点的前一个节点。
  • 后继指针 (Next): 指向当前节点的后一个节点。

文章配图

插入操作逻辑

头插法

新节点插入到头部之前,需调整四个指针指向:

  1. 新节点的 Next 指向原第一个节点。
  2. 原第一个节点的 Prev 指向新节点。
  3. 头节点的 Next 指向新节点。
  4. 新节点的 Prev 指向头节点。

尾插法

新节点插入到尾部之后,需调整四个指针指向:

  1. 原最后一个节点的 Next 指向新节点。
  2. 新节点的 Prev 指向原最后一个节点。
  3. 新节点的 Next 指向头节点。
  4. 头节点的 Prev 指向新节点。

文章配图 文章配图

目录

  1. 双向链表的实际应用
  2. 头文件定义 (list.h)
  3. 实现细节 (list.c)
  4. 增加节点函数
  5. 指针位置说明
  6. 插入操作逻辑
  7. 头插法
  8. 尾插法

更多推荐文章

查看全部
  • Kiro 安装指南与核心功能解析
  • WebApp 设计三大关键维度:导航、配置模型与核心要点
  • 冯·诺依曼架构与哈佛架构解析
  • C++11 新特性详解:可变参数模板、类功能与 STL 变化
  • PostgreSQL 远程安全访问配置:使用 Cpolar 内网穿透
  • IT 安全核心:实时网络安全监控与 SIEM 解决方案
  • ESP32 + MimiClaw 组合机器人 BLDC 驱动与智能控制方案
  • 无人机飞行空域申请全流程指南
  • 中国机器人及人工智能大赛自主巡航实战经验分享
  • Python 编写简易 Web 应用框架实战指南
  • llamafile 使用指南:从下载到运行仅需 3 步
  • 动态规划经典模型:0-1 背包与最长公共子序列
  • GitHub 高效挖掘开源项目的四种实用方法
  • C++ 类与对象进阶:默认成员函数与运算符重载
  • Python 数据清理与准备最佳实践:清洗、合并与存储
  • C++ 内存管理:从裸指针到智能指针的进化
  • C++ 基础核心概念:命名空间、引用与内联函数
  • Flutter for OpenHarmony 实战:通义万相 AIGC 联调与相册持久化
  • 基于低代码引擎快速构建企业级审批系统实战
  • 旋转排序数组二分查找解法:LeetCode 33 题实战

相关免费在线工具

  • 加密/解密文本

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