【数据结构】‘双向链表’冲冲冲

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 构建节点
- 初始化
- 打印
- 尾插
- 尾删
- 头插
- 头删
- 计算链表长度
- 查找
- pos位置插入(一般都是pos之前)
- 删除pos位置
- 删除时的注意点
构建节点
//构建节点
LTNode* BuyLTNode(LTDataType x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));if (newnode == NULL){perror("newnode fail");exit(-1);}newnode->data = x;return newnode;
}
初始化
我们的节点是双向循环链表
//初始化
LTNode* LTInit()
{LTNode* phead = BuyLTNode(-1);phead->next = phead;phead->prev = phead;return phead;
}
打印
//打印
void print(LTNode* phead)
{assert(phead);printf("phead<=>");LTNode* cur = phead->next;while (cur != phead){printf("%d<=>", cur->data);cur = cur->next;}printf("\n");
}
尾插
思路:

代码:
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* tail = phead->prev;LTNode* newnode = BuyLTNode(x);newnode->prev = tail;tail->next = newnode;newnode->next = phead;phead->prev = newnode;
}
尾删
思路:

代码:
//尾删
void LTPopBack(LTNode* phead)
{assert(phead);assert(phead->prev!=phead);LTNode* cur = phead->prev->prev;free(cur->next);cur->next = phead;phead->prev = cur;
}
运行结果:

头插
思路:

代码;
//头插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = BuyLTNode(x);//先改newnode节点后newnode->next = phead->next;phead->next->prev = newnode;//在改前newnode->prev = phead;phead->next = newnode;}
运行结果:

头删
思路:

代码:
//头删
void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* cur = phead->next->next;free(phead->next);//链接顺序不能变phead->next = cur;phead = cur->prev;
}
运行结果:

计算链表长度
//如果让哨兵节点的内容是链表长度 ,那么,data的数据类型必须是int型。
//链表长度
//如果让哨兵节点的内容是链表长度 ,那么,data的数据类型必须是int型。
int LTSize(LTNode* phead)
{int size = 0;LTNode* cur = phead->next;while (cur != phead){size++;cur = cur->next;}return size;
}

查找
pos位置插入(一般都是pos之前)
思路:

代码:
//pos位置插入(一般都是pos之前)
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = BuyLTNode(x);LTNode* cur = pos->prev;//先链接newnode后newnode->next = pos;pos->prev = newnode;//再链接newnode前cur->next = newnode;newnode->prev = cur;
}
删除pos位置
思路:
代码:
//删除pos位置
void LTErase(LTNode* pos)
{assert(pos);LTNode* posprev = pos->prev;LTNode* posnext = pos->next;free(pos);//链接顺序不能变posprev->next = posnext;posnext->prev = posprev;
}
删除时的注意点

链接顺序不能变的原因: 如果先posnext->prev = posprev;
(此时posnext->prev仍然指向原来pos节点地址,
因为我们free的是pos节点内容,他的地址仍在,
不会改变其他节点的指向。 )
那么等于posprev又重新指向了pos地址,
所以在打印时,会出现一串地址
相关文章:
【数据结构】‘双向链表’冲冲冲
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
Linux 编译CEF源码详细记录
Linux CEF(Chromium Embedded Framework)源码下载编译 背景 由于CEF默认的二进制分发包不支持音视频播放,需要自行编译源码,将ffmpeg开关打开才能支持。这里介绍的是Linux平台下的CEF源码下载编译过程。 Windows平台参考&#…...
LeetCode 2810. Faulty Keyboard【模拟,双端队列,字符串】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
两个数组的交集-C语言/Java
描述 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。(1 < nums1.length, nums2.length < 1000,0 < nums1[i], nums2[i] < 1000) 示例1 输入…...
Arduino+esp32学习笔记
学习目标: 使用Arduino配置好蓝牙或者wifi模块 学习使用python配置好蓝牙或者wifi模块 学习内容(笔记): 一、 Arduino语法基础 Arduino语法是基于C的语法,C又是c基础上增加了面向对象思想等进阶语言。那就只记录没见过的。 单多…...
计算机网络-专业术语
计算机网络-专业术语 实体 实体:任何可发送或接收信息的硬件或软件进程 对等实体:收发双方相同层次中的实体 协议 控制两个对等实体进行逻辑通信的规则的集合 协议三要素 语法 定义所交换的信息的格式 是用户数据与控制信息的结构和格式 语义 定义收发双方所需要完成的操作…...
E. Maximum Monogonosity
You are given an array aa of length nn and an array bb of length nn. The cost of a segment [l,r][l,r], 1≤l≤r≤n1≤l≤r≤n, is defined as |bl−ar||br−al||bl−ar||br−al|. Recall that two segments [l1,r1][l1,r1], 1≤l1≤r1≤n1≤l1≤r1≤n, and [l2,r2][l2,…...
已解决Excel file format cannot be determined, you must specify an engine manually
问题 我使用以下语句时出现错误 data pd.read_excel(temp_inputc.csv, headerNone)出现错误: Excel file format cannot be determined, you must specify an engine manually有很多人说添加engine,但接下来会出现这个错误: File is not…...
Centos yum命令大全
1.使用YUM查找软件包 $ yum search python 2.列出所有可安装的软件包 $ yum list | grep python 3.列出所有可更新的软件包 $ yum list updates 4.列出所有已安装的软件包 $ yum list installed | grep python...
内网横向移动—ARP攻击图片捕捉数据劫持DNS劫持
内网横向移动—ARP攻击&图片捕捉&数据劫持&DNS劫持 1. ARP1.1. APR介绍1.1.1. ARP工作原理1.1.2. APR欺骗工作原理 1.2. 环境准备1.3. 适用场景 2. ARP断网攻击演示2.1. 使用kali进行演示2.1.1. nmap判断存活2.1.2. 安装工具2.1.3. 攻击Windows 10虚拟机2.1.3.1. 查…...
react之Hooks的介绍、useState与useEffect副作用的使用
react之Hooks的介绍、useState与useEffect副作用的使用 一、Hooks的基本介绍二、useState的使用2.1 简单使用2.2 数组结构简化2.3 状态的读取和修改2.3 组件的更新过程 三、useEffect的使用3.1 副作用介绍3.2 基本使用3.3 依赖3.4 不要对依赖项撒谎3.5 依赖项可以是空数组3.6 清…...
django——创建 Django 项目和 APP
2.创建 Django 项目和 APP 命令: 创建Django项目 django-admin startproject name 创建子应用 python manager.py startapp name 2.1 创建工程 在使用Flask框架时,项目工程目录的组织与创建是需要我们自己手动创建完成的。 在django中,…...
== 和 equals 的对比 [面试题]
和 equals 的对比[面试题] 文章目录 和 equals 的对比[面试题]1. 和 equals 简介2. Object 类中 equals() 源码3. String 类中 equals() 源码4. Integer 类中 equals() 源码5. 如何重写 equals 方法 1. 和 equals 简介 是一个比较运算符 :既可以判断基本数据类型…...
SpringBoot集成Redis及Redis使用方法
目录 应用背景 Redis简介 更新问题 一:环境配置 1.1: 在pom.xml文件中添加依赖 1.2:配置SpringBoot核心配置文件application.properties 二:在Config文件夹中创建RedisConfig配置文件类 2.1:RedisTemplate中的几个角色&am…...
Redis可以用作数据库吗?它的适用场景是什么?
是的,Redis可以用作数据库。虽然Redis通常被认为是一个内存数据库(in-memory database),但它也可以通过持久化机制将数据保存在磁盘上,以便在重启后恢复数据。 Redis的适用场景包括但不限于以下几个方面: …...
@Param详解
文章目录 背景什么是ParamParam的使用方法使用方法:遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景 最近在开发过程中,在写mapper接口是在参数前加了Param注解,但是在运行的时候就会报错,说…...
自定义分页工具类
前言 在日常的开发工作中,会遇到很多不确定的需求场景,无法使用第三方提供的分页组件来实现,那么如何自己实现一个简单的分页工具类呢? 工具类 第一版本: Setter Getter public class PageTool<T> {/*** 当前…...
文本数据保存
文本数据保存 工具目的代码运行结果 工具 pycharm 目的 网址:https://ljgk.envsc.cn/ 需求:获取到地址(address),公司名字(ps_name),创建的时间(create_time)ÿ…...
Python爬虫:抓取表情包的下载链接
Python爬虫:抓取表情包的下载链接 1. 前言2. 具体实现3. 实现代码 1. 前言 最近发现了一个提供表情包的网址,觉得上面的内容不错,于是就考虑用Python爬虫获取上面表情包的下载链接。整体而言,实现这个挺简单的,就是找到提供表情包…...
(文章复现)基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码
参考文献: [1]高瑜,黄森,陈刘鑫等.基于改进灰狼算法的并网交流微电网经济优化调度[J].科学技术与工程, 2020,20(28):11605-11611. [2]邓长征,冯朕,邱立等.基于混沌灰狼算法的交直流混合微网经济调度[J].电测与仪表, 2020, 57(04):99-107. 这两篇文章不管是从模型、…...
Home Assistant美的设备本地控制终极指南:摆脱云端依赖,实现快速响应
Home Assistant美的设备本地控制终极指南:摆脱云端依赖,实现快速响应 【免费下载链接】homeassistant-midea-air-appliances-lan This Home Assistant custom component adding support for controlling Midea air conditioners and dehumidifiers on lo…...
跨平台资源拦截下载器:5步实现全平台视频音频自动捕获
跨平台资源拦截下载器:5步实现全平台视频音频自动捕获 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容…...
4月18日腾讯云「龙虾公开课」落地合肥!免费线下AI实战课,还有限定周边等你拿
合肥线下:免费AI实战课的吸引力4月18日,腾讯云开发者社区「龙虾公开课」将在合肥高新区中安创谷科技园二期H1栋国际会客厅举办。此次活动提供免费的线下AI Agent实战课,即使是零基础的参与者也能参与。课程涵盖1对1装机指导、现场实操工坊&am…...
开机卡在‘reboot and select proper boot device’?别慌,这3个BIOS设置检查点帮你5分钟搞定
开机卡在‘reboot and select proper boot device’?三步排查法助你快速恢复系统 遇到电脑开机时突然显示"reboot and select proper boot device"的提示,确实会让人心头一紧。这个报错意味着系统在启动时找不到可引导的设备,但别担…...
【限时解密】头部AI编码平台未公开的长代码分治协议:动态切片+跨段约束注入+状态感知回溯(附可运行PoC)
第一章:智能代码生成在长代码中的挑战 2026奇点智能技术大会(https://ml-summit.org) 当智能代码生成模型面对超过千行的模块化系统(如微服务入口层、编译器前端或分布式事务协调器)时,其输出质量常出现显著衰减。这种衰减并非源…...
测试深度策略
** 测试深度常用策略 ** 按覆盖深度 需求覆盖:每条需求都有对应用例,不漏场景功能覆盖:主流程、分支、异常、边界都测到接口覆盖:入参、出参、必填/非必填、枚举、错误码代码覆盖:语句、分支、条件、路径覆盖ÿ…...
BilibiliDown:免费跨平台B站视频下载器终极指南
BilibiliDown:免费跨平台B站视频下载器终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bili…...
【PAT甲级真题】- Forwards on Weibo (30)
题目来源 Forwards on Weibo (30) 注意点 下标从 1 开始 题目描述 Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations.…...
Matlab绘图进阶:xlabel函数从基础到高阶的实用指南
1. xlabel函数基础入门 第一次接触Matlab绘图时,我盯着那个默认的"X轴"标签看了好久,总觉得它太单调了。后来发现xlabel这个宝藏函数,简直打开了新世界的大门。xlabel最基本的功能就是给x轴加标签,但千万别小看这个简单…...
GBase 8a数据库双活容灾方案之应用场景及案例解析
南大通用GBase 8a数据库(gbase database)基于列存引擎与分片同步机制,构建了完整的双活容灾方案。核心同步工具GVR依托sync_clientsync_server组件,实现主备集群间增量数据毫秒级同步,点对点速度达450MB/s,支持同城双活…...
