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

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

 📜虚拟滚动与长列表优化

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

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

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

 🌐浏览器历史记录

📒双向链表的实际应用


📂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

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

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

     */

Read more

20-OpenClaw定时任务与自动化工作流

20-OpenClaw定时任务与自动化工作流

OpenClaw 定时任务与自动化工作流 ✦ 免费专栏|全套教程: OpenClaw 从入门到精通 ✦ 开篇总览|最新目录: 最新 OpenClaw 教程|从入门到精通|AI 智能助手 / 自动化 / Skills 实战(原 Clawdbot/Moltbot) 本文档详细介绍 OpenClaw 的定时任务和自动化功能,包括 Cron 配置、Heartbeat 心跳机制以及自动化工作流的设计与实践。 目录 1. 概述 2. Cron 定时任务配置 3. Heartbeat 心跳机制 4. 自动化工作流设计 5. 实战案例 6. 最佳实践与注意事项 1. 概述 OpenClaw 提供了强大的定时任务和自动化能力,让 AI 助手能够主动执行任务,

By Ne0inhk

Flutter 三方库 docker_commander 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、多端协同的 Docker 容器管理与 CI/CD 编排引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 docker_commander 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、多端协同的 Docker 容器管理与 CI/CD 编排引擎 在鸿蒙(OpenHarmony)系统的桌面端设备(PC Mode)、高性能后台监控管理中心或基于鸿蒙的自动化产线控制台上,如何通过 Dart 代码即时管理本地及远程的 Docker 容器、执行 Container 指令或部署 PostgreSQL/Nginx 等标准化镜像?docker_commander 为开发者提供了一套工业级的、基于 Shell 与 REST 驱动的 Docker 指令集封装方案。本文将深入实战其在跨端容器治理中的应用。 前言 什么是 Docker

By Ne0inhk
【Linux】sudo 命令提升权限的使用技巧

【Linux】sudo 命令提升权限的使用技巧

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Linux这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Linux sudo 命令提升权限的使用技巧 🛠️ * 一、sudo 命令基础 🧱 * 1.1 什么是 sudo? * 1.2 如何使用 sudo? * 1.3 sudo 的基本语法 * 二、sudo 配置文件详解 🔧 * 2.1 编辑 sudoers 文件 * 2.2 基本语法结构 * 示例: * 2.3 组和别名 * 组 (Group) * 别名 (Alias) * 三、

By Ne0inhk

Kali Linux 官方更新命令详解

一、基础更新命令 1.1 标准更新流程 完整的官方更新命令序列: # 1. 更新软件包源列表(必需的第一步)sudoapt update # 2. 升级已安装的软件包(推荐)sudoapt upgrade -y # 3. 完全系统升级(包含依赖关系调整)sudoapt full-upgrade -y # 4. 可选的发行版升级(谨慎使用)sudoapt dist-upgrade -y 1.2 各命令详细说明 sudo apt update · 功能:更新本地软件包索引,从配置的软件源下载最新的软件包信息 · 频率:每次进行升级操作前都应执行 · 工作原理: · 读取 /etc/apt/sources.list 和 /etc/apt/sources.

By Ne0inhk