news 2026/5/25 14:34:26

7_链表的学习与应用--双向循环链表_增加操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
7_链表的学习与应用--双向循环链表_增加操作
相信大家都在学习双向链表的过程中痛不欲生,但没关系相信大家看了这篇文章之后会对着抽象的数据结构有一个新的理解 这段时间以来笔者也是成功入职了一家方案公司,也算是实现了最初的那个梦想吧!| 话不多说现在开始双向循环链表插入知识的介绍 本人郑重承诺: 所有文章均不设置任何观看门槛均免费
  • 📒双向链表的实际应用

  • 🌐浏览器历史记录

  • ✍️文本编辑器的“撤销”与“重做”

  • 🖥️操作系统中的进程调度

  • 🎮游戏开发与多媒体播放列表

  • 📜虚拟滚动与长列表优化


  • 🍋老规矩上源码

  • 📂list.h 文件

#ifndef __LIST_H_ #define __LIST_H_ #include <stdio.h> #include <windows.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_Iint(); /* 增加链表 */ 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 文件

/********************************************************************** * 函数名称: List_Add * 功能描述: 增加一个节点 * 输入参数: @Head_头节点 * @Flight_Number_航班号 * @Flight_Name_航班名 * @Determine_判断是否头插 * 输出参数: 新的头节点 * 返 回 值: 新的头节点 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2026/02/23 V1.0 Orange-341024489 创建 * 2026/02/23 V1.1 Assistant 修复逻辑错误 ***********************************************************************/ 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); /* 如果实在记不住顺序就记指针的出场顺序无论是头插还是尾插 * 就记住指针的出场顺序 * 1: -> Next * 2: -> Prev * 3: -> Next * 4: -> Prev *代入记忆法: 头插法就是"小弟说我要当老大" *代入记忆法:尾插法就是"新来的这个小弟你来当" */ 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" 的位置位于哪里

👉前驱指针_Prev

让节点向前的进的指针;所以位于几何关系的右边

👈后继指针_Next

让节点后退的指针;所以位于几何关系的左边

  • 👑头插与尾插巧记法_黑帮夺位

现在开始忘记所有你之前学的知识,老师讲的/其他博主说的.现在听我讲一个故事

⌚️故事一:重生之我要当老大

在很久很久一起前知道有一个门派叫"坤门"

  • 而你,你就是这个故事的主角名字叫,Temporary_Node,可你不满足于这个门派.你说我要做就要做最大.于是你把目标瞄准了.隔壁的坤门,他的老大叫:Flight_List
/* 第一个节点 */ Flight_List *First_Node = Head-> Next;
  • 你和这个坤门发生什么事呢?就是你想当"坤门"的老大 ,你跟门派老大说.下个位置(Next)是我的!
/*头插情景剧记忆法: 小弟说我要当老大*/ Temporary_Node -> Next = First_Node;
  • 于是,经过一番激烈的交战之后,坤门老大打不过你就把位置让给你了.
/*头插情景剧记忆法: 老大打不过就把位置让了出来*/ First_Node -> Prev = Temporary_Node;
  • 坤门老二(Head)见状,也赶紧来投降.
/*头插情景剧记忆法: 老二看到老大也不行了就也把位置让给新来的*/ Head -> Next = Temporary_Node;
  • 你前去迎接老二
/*头插情景剧记忆法: 新来的前去接老二*/ Temporary_Node -> Prev = Head;
  • 这就是头插法巧妙记忆的公式了
/* 头插法 */ 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; }

👦故事二:重生之我要见老大

现在开始有第二个故事了,现在你武功没那么高,打算拜见坤门,所以你只能从从小弟开始当.坤门唯一的小弟(Last_Node)

/* 最后一个节点 */ Flight_List *Last_Node = Head -> Prev;
  • 小弟说;"新来的以后就你负责倒垃圾换水的活了"
/*尾插情景剧记忆法: 小弟说:"新来的这个小弟你来当"*/ Last_Node -> Next = Temporary_Node;
  • 你作为新来的说"我当就我当"
/*尾插情景剧记忆法: 新来小弟说:"我当就我当"*/ Temporary_Node -> Prev = Last_Node;
  • 终于有一天你受不了了说我要见老大
/*尾插情景剧记忆法: 新来小弟后面不服,说接下来我要见老大*/ Temporary_Node -> Next = Head;
  • 于是老大跑去见你,说别感冒
/*尾插情景剧记忆法:老大前来见小弟*/ Head -> Prev = Temporary_Node;
  • 这就是尾插法巧妙记忆的公式了
/* 尾插法 */ 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; }

👍强记方法

/* 如果实在记不住顺序就记指针的出场顺序无论是头插还是尾插

* 就记住指针的出场顺序

* 1: -> Next

* 2: -> Prev

* 3: -> Next

* 4: -> Prev

*代入记忆法: 头插法就是"小弟说我要当老大"

*代入记忆法:尾插法就是"新来的这个小弟你来当"

*/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/4 8:14:15

【实战】Ubuntu 24.04下本地部署开源项目Higress

Higress 是基于 Istio 和 Envoy 开发的云原生网关&#xff0c;支持流量管理、安全防护、可观测性等功能&#xff0c;适用于 Kubernetes 环境或单机快速部署场景。 本文将结合实践步骤&#xff0c;详细讲解在 Ubuntu 24.04 系统中通过 Docker 部署 Higress 的完整流程&#xff0…

作者头像 李华
网站建设 2026/4/1 10:10:19

[Sensors]BMI270 FIFO模式下的数据同步与中断优化策略

1. 理解BMI270的FIFO工作机制 BMI270作为一款高性能惯性测量单元(IMU)&#xff0c;其内置的FIFO(先进先出)缓冲区是实现高效数据采集的关键组件。这个2KB大小的缓冲区就像一个临时仓库&#xff0c;能够存储加速度计和陀螺仪的原始数据。在实际项目中&#xff0c;我发现合理配置…

作者头像 李华
网站建设 2026/4/1 10:07:36

如何安全修改暗黑破坏神2存档?d2s-editor安全工具全面指南

如何安全修改暗黑破坏神2存档&#xff1f;d2s-editor安全工具全面指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 《暗黑破坏神2》作为经典ARPG游戏&#xff0c;其角色存档&#xff08;d2s文件&#xff09;承载着玩家数百小…

作者头像 李华
网站建设 2026/4/4 8:16:11

四十九、OpenLayers进阶滤镜实战——从基础调色到高级卷积核特效全解析

1. OpenLayers滤镜技术全景概览 地图可视化项目中&#xff0c;图层滤镜就像摄影师的调色板。OpenLayers提供了从基础CSS滤镜到像素级卷积核的两套技术方案&#xff0c;就像手机修图APP中的一键美化与专业PS工具的区别。我在多个智慧城市项目中实测发现&#xff0c;90%的基础调色…

作者头像 李华
网站建设 2026/4/2 14:14:39

react(二)useEffect 和 useRef

useEffect 副作用 在 React 中&#xff0c;副作用指的是在组件渲染过程中&#xff0c;除了返回 JSX 之外进行的任何操作&#xff0c;这些操作会影响组件外部或与外部系统进行交互。 在函数式编程和 React 上下文中&#xff1a; 纯函数&#xff1a;相同的输入 ⇒ 相同的输出&…

作者头像 李华