链表的学习与应用--双向循环链表_增加操作
相信大家都在学习双向链表的过程中痛不欲生,但没关系相信大家看了这篇文章之后会对着抽象的数据结构有一个新的理解 这段时间以来笔者也是成功入职了一家方案公司,也算是实现了最初的那个梦想吧!| 话不多说现在开始双向循环链表插入知识的介绍 本人郑重承诺: 所有文章均不设置任何观看门槛均免费
📜虚拟滚动与长列表优化
🎮游戏开发与多媒体播放列表
🖥️操作系统中的进程调度
✍️文本编辑器的“撤销”与“重做”
🌐浏览器历史记录
📒双向链表的实际应用
📂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
*代入记忆法: 头插法就是"小弟说我要当老大"
*代入记忆法:尾插法就是"新来的这个小弟你来当"
*/