当前位置: 首页 > news >正文

第五章:C语言数据结构与算法之双向带头循环链表

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、哨兵位的头节点
  • 二、双向链表的结点
  • 三、接口函数的实现
    • 1、创建结点
    • 2、初始化
    • 3、尾插与尾删
    • 4、头插与头删
    • 5、打印
    • 6、查找
    • 7、随机插入与随机删除
    • 8、判空、长度与销毁
  • 四、顺序表和链表的对比
    • 1. 不同点
    • 2. 优缺点
  • 五、缓存命中
    • 1、缓存
    • 2、缓存命中
  • 总结


前言

一般题目给的单链表是无头单向非循环链表,但是我们可以升级成双向带头循环链表,这个链表比起单链表更有优势。


一、哨兵位的头节点

在这里插入图片描述

上面带有head头结点的链表就是带头的链表,题目中的链表一般没有头节点,phead指针直接指向第一个结点,而带头的链表phead指针指向头结点,头节点指向第一个结点,一般称为 哨兵位的头节点

二、双向链表的结点

typedef int LTDataType;typedef struct ListNode
{struct ListNode* next;struct ListNode* prev;LTDataType data;
}LTNode;

比起单链表的结点,多了指向前一个结点的指针——prev。

三、接口函数的实现

1、创建结点

LTNode* BuyListNode(LTDataType x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));assert(newnode);newnode->next = NULL;newnode->prev = NULL;newnode->data = x;return newnode;}

2、初始化

LTNode* InitList()
{LTNode* phead = BuyListNode(-1);phead->next = phead;phead->prev = phead;return phead;
}

初始化即开辟一个头节点,然后让这个头节点的前后指针域都指向自己。

3、尾插与尾删

在这里插入图片描述

void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = BuyListNode(x);	newnode->prev = phead->prev;phead->prev->next = newnode;newnode->next = phead;phead->prev = newnode;
}void LTPopBack(LTNode* phead)
{assert(phead);assert(phead->next != phead);//空phead->prev = phead->prev->prev;free(phead->prev->next);phead->prev->next = phead;}

双向带头循环链表并没有单独讨论空链表的情况,这就是头节点的好处,之所以不用讨论就是因为节点的个数不可能为0,最少也包括一个头节点。

4、头插与头删

在这里插入图片描述

void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = BuyListNode(x);LTNode* tail = phead->next;newnode->next = phead->next;newnode->prev = phead;tail->prev = newnode;phead->next = newnode;}void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* tail = phead->next->next;LTNode* tailPrev = phead->next;phead->next = tail;tail->prev = phead;free(tailPrev);}	

5、打印

void LTPrint(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){printf("[%p | %d | %p]", cur->prev, cur->data, cur->next);if(cur->next != phead)printf("<->");cur = cur->next;}printf("\n");
}

就是从头遍历一遍即可,但是需要注意的是,这是一个循环链表,如果我们不加限制条件的话,他会一直循环下去。所以,我们这里需要加上判断条件。

6、查找

LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);assert(phead->next != phead);LTNode* cur = phead->next;while (cur->data != x && cur != phead)cur = cur->next;if (cur == phead)return NULL;else return cur;
}

也要加限制条件。

7、随机插入与随机删除

void* LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = BuyListNode(x);LTNode* tail = pos->prev;tail->next = newnode;newnode->next = pos;newnode->prev = tail;pos->prev = newnode;
}void* LTErase(LTNode* pos)
{assert(pos);LTNode* tail = pos->prev;tail->next = pos->next;tail->next->prev = tail;free(pos);
}

实现方式之前的头尾操作一样,也可以复用到头尾操作中。

8、判空、长度与销毁

bool LTEmpty(LTNode* phead)
{assert(phead);return phead->next != phead;
}size_t LTSize(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;size_t size = 0;while (cur != phead){size++;cur = cur->next;}return size;
}void LTDestory(LTNode* phead)
{LTNode* cur = phead->next;while (cur != phead)LTErase(cur);free(phead);
}

逐个释放就行。

四、顺序表和链表的对比

1. 不同点

不同点顺序表链表
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持O(1)不支持:O(N)
任意位置插入或者删除元素可能需要搬移元素,效率低O(N)只需修改指针指向
插入动态顺序表,空间不够时需要扩容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁
缓存利用率

2. 优缺点

顺序表:
优点:尾插尾删效率高,下标的随机访问。
缺点:空间不够需要扩容(扩容的代价大);头部或者中间插入删除效率低,需要挪动数据。

链表:
优点:需要扩容,按需申请释放小块结点内存;任意位置插入效率很高–O(1)。
缺点:不支持下标随机访问;

五、缓存命中

1、缓存

CPU与内存经常有数据的访问与存储,但两者运行速度不同,就导致了CPU会“等待”内存传输数据的情况,我们在二者之间搭建一片缓冲区域,即缓存,来解决这个问题。
在这里插入图片描述
从下到上,各种存储器的内存逐渐降低,数据传输速度逐级增高。

2、缓存命中

那么每次CPU会从寄存器中读取数据,这二者的速度差距已经大大缩小了。我们以一个数组为例,我们想对第一个元素进行计算,我们不仅会把第一个元素所对的内存传输到寄存器,还会把其相邻的内存空间传输到寄存器中作为备用,每次传输到寄存器中的数据的大小取决于电脑的相应配置。
这样,我们在CPU访问完第一元素后,假设我们还需要计算第二个元素,我们又恰好在寄存器中存储了第二个元素的内存信息。CPU便可直接调用,而无需寄存器再去读取。这就叫缓存命中。


总结

链表和顺序表各有优势,带头双向链表比起单链表更加方便操作。

深窥自己的心,而后发觉一切的奇迹在你自己。——培根

相关文章:

第五章:C语言数据结构与算法之双向带头循环链表

系列文章目录 文章目录系列文章目录前言一、哨兵位的头节点二、双向链表的结点三、接口函数的实现1、创建结点2、初始化3、尾插与尾删4、头插与头删5、打印6、查找7、随机插入与随机删除8、判空、长度与销毁四、顺序表和链表的对比1. 不同点2. 优缺点五、缓存命中1、缓存2、缓存…...

一文带你了解,前端模块化那些事儿

文章目录前端模块化省流&#xff1a;chatGPT 总结一、参考资料二、发展历史1.无模块化引出的问题:横向拓展2.IIFE3.Commonjs(cjs)4.AMD引出的问题&#xff1a;5.CMD6.UMD7.ESM往期精彩文章前端模块化 省流&#xff1a;chatGPT 总结 该文章主要讲述了前端模块化的发展历史和各个…...

(六十五)大白话设计索引的时候,我们一般要考虑哪些因素呢?(中)

今天我们继续来说一下&#xff0c;在设计索引的时候要考虑哪些因素。之前已经说了&#xff0c;你设计的索引最好是让你的各个where、order by和group by后面跟的字段都是联合索引的最左侧开始的部分字段&#xff0c;这样他们都能用上索引。 但是在设计索引的时候还得考虑其他的…...

Spring事务管理

文章目录1 事务1.1 需求1.2 原因分析1.3 错误解决1.4 yml配置文件中开启事务管理日志1 事务 1.1 需求 当部门解散了不仅需要把部门信息删除了&#xff0c;还需要把该部门下的员工数据也删除了。可当在删除员工数据出现异常时&#xff0c;就不会执行删除员工操作&#xff0c;出…...

数字化工厂装配线生产管理看板系统

电力企业业务复杂&#xff0c;组织结构复杂&#xff0c;不同的业务数据&#xff0c;管理要求也不尽相同。生产管理看板系统针对制造企业的生产应用而开发&#xff0c;能够帮助企业建立一个规范准确即时的生产数据库。企业现状&#xff1a;1、计划不清晰&#xff1a;生产计划不能…...

vxe-grid 全局自定义filter过滤器,支持字典过滤

一、vxe-table的全局筛选器filters的实现 官网例子&#xff1a;https://vxetable.cn/#/table/renderer/filter 进入之后&#xff1a;我们可以参照例子自行实现&#xff0c;也可以下载它的源码&#xff0c;进行调整 下载好后并解压&#xff0c;用vscode将解压后的文件打开。全局…...

ECharts 环形图组件封装

一、ECharts引入1.安装echarts包npm install echarts --save2.引入echarts这里就演示全局引入了&#xff0c;挂载到vue全局&#xff0c;后面使用时&#xff0c;直接使用 $echartsimport * as echarts from echarts Vue.prototype.$echarts echarts二、写echarts组件这里演示环…...

c++ 怎么调用python 提供的函数接口

在 C 中调用 Python 函数有多种方法&#xff0c;以下是其中的两种常见方法&#xff1a;使用 Python/C APIPython 提供了 C/C API&#xff0c;可以通过该 API 在 C 中调用 Python 函数。使用这种方法&#xff0c;需要先将 Python 解释器嵌入到 C 代码中&#xff0c;然后可以通过…...

【动态规划】背包问题(01背包,完全背包)

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

记录 UE5 完全重新构建 UE C++项目

不知道搞了什么&#xff0c;C项目的实时代码编译罢工了&#xff0c;搞了半天都修不好&#xff0c;只能又重建了 UE5 版本为 v5.1.1 删除以下文件夹 /Binaries /Intermediate /SavedBinaries 文件夹是编译后的模块 Intermediate 文件夹里是中间层的C代码&#xff0c;完全由ue…...

java版云HIS系统源码 微服务架构支持VUE

云his系统源码 一个好的HIS系统&#xff0c;要具有开放性&#xff0c;便于扩展升级&#xff0c;增加新的功能模块&#xff0c;支撑好医院的业务的拓展&#xff0c;而且可以反过来给医院赋能&#xff0c;最终向更多的患者提供更好地服务。 私信了解更多&#xff01; 本套基于…...

苹果内购支付检验错误码

21000 The request to the App Store didn’t use the HTTP POST request method. 对App Store的请求没有使用HTTP POST请求方法。 21001 The App Store no longer sends this status code. App Store不再发送此状态代码。 21002 The data in the receipt-data property…...

day27_css

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、CSS 零、 复习昨日 见代码 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通…...

智慧赋能,聚力开源——第四届OpenI/O 启智开发者大会开源治理专场顺利举办!

为汇聚国内外知名开源组织共同探讨中国开源生态建设及开源治理相关议题&#xff0c;推进产学研用开源合作&#xff0c;2月24日下午&#xff0c;第四届OpenI/O启智开发者大会在深圳人才研修院智汇中心举办以“构建开源联合体&#xff0c;共建开源生态”为主题的开源治理专场分论…...

Java工程师应该如何成长?

近几年&#xff0c;不少开发者会抱怨“面试造火箭&#xff0c;天天拧螺丝”&#xff0c;每天进行重复业务开发&#xff0c;似乎能力被日常工作限制&#xff0c;无法突破提高。 极客时间《Java 核心技术 36 讲》专栏作者杨晓峰认为&#xff0c;如果处于新手阶段&#xff0c;全面…...

【数据分析师求职面试指南】必备编程技能整理之Hive SQL必备用法

文章目录熟悉Python懂R语言掌握SQL大数据基础数据库常用类型多表查询更多聚合函数distinctcase when窗口函数动态更新一行变多行调优内容整理自《拿下offer 数据分析师求职面试指南》—徐粼著 第四章编程技能考查其他内容&#xff1a;【数据分析师求职面试指南】必备基础知识整…...

Maven - Linux 服务器 Maven 环境安装与测试

目录 一.引言 二.安装流程 1.获取安装包 2.解压并安装 3.配置环境 4.mvn 验证 三.测试踩坑 1.Permission denied 2.Plugin or dependencies Error 一.引言 通道机上的 java 项目需要 mvn package 提示没有 mvn 命令&#xff0c;下面记录下安装 maven 的全过程。 二.安…...

5G模块可以注册到4G,不能注册到5G;SIM卡接到5G手机是可以注册到5G网络的?

5G网络覆盖范围较小或者信号质量不佳。在这种情况下&#xff0c;您可以尝试移动到不同的位置&#xff0c;以获得更好的信号质量和覆盖范围。 目前&#xff0c;5G网络已经在全球多个国家和地区推出&#xff0c;并且在不断扩大覆盖范围。以下是一些已经拥有5G覆盖的主要地区&…...

宝塔webhook自动化打包vue项目时,npm不生效问题

文章目录&#x1f4cb;前言&#x1f3af;查看webhook配置的代码&#x1f3af;测试代码&#xff0c;检查输出内容&#x1f3af;解决方法&#x1f4cb;前言 这篇文章主要是记录和解决在宝塔面板中&#xff0c;webhook自动化打包vue项目时&#xff0c;npm不生效问题。说来奇怪&am…...

嵌入式 Linux进程间通信之信号量

目录 一、信号量 1、信号量概述 2、什么是信号量 3、信号量的分类 4、进程获取共享资源要执行的操作 5、System V IPC 机制&#xff1a;信号量 5.1 semget函数 5.2 semop函数 5.3 semctl函数 一、信号量 1、信号量概述 信号量集&#xff1a;由若干个信号组成的集合&a…...

amlogic-s9xxx-armbian项目全指南:从闲置设备到智能服务器的转变

amlogic-s9xxx-armbian项目全指南&#xff1a;从闲置设备到智能服务器的转变 【免费下载链接】amlogic-s9xxx-armbian amlogic-s9xxx-armbian: 该项目提供了为Amlogic、Rockchip和Allwinner盒子构建的Armbian系统镜像&#xff0c;支持多种设备&#xff0c;允许用户将安卓TV系统…...

OZON跨境电商的供应链之痛:爆单AI选品后为什么你拿货比别人贵?

选品决定利润的上限&#xff0c;供应链决定利润的下限做跨境电商&#xff0c;有一个残酷的事实&#xff1a;同样的商品&#xff0c;你卖100块&#xff0c;利润20块。别人卖90块&#xff0c;利润还有25块。为什么&#xff1f;不是你卖得不好&#xff0c;不是你运营不行&#xff…...

LiuJuan20260223Zimage参数详解:LoRA rank/alpha设置对人像细节影响深度分析

LiuJuan20260223Zimage参数详解&#xff1a;LoRA rank/alpha设置对人像细节影响深度分析 1. 引言&#xff1a;从一张好看到一张传神 你肯定见过很多AI生成的人像&#xff0c;有的乍一看还行&#xff0c;但总觉得哪里不对劲——可能是眼神呆滞&#xff0c;可能是发丝模糊&…...

Onekey:Steam游戏清单管理的自动化解决方案 | 玩家与开发者必备工具

Onekey&#xff1a;Steam游戏清单管理的自动化解决方案 | 玩家与开发者必备工具 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 当独立游戏开发者小林第三次因为手动复制Steam App ID出错而导致…...

SwiftDate内存泄漏排查指南:5个Closure与委托模式最佳实践

SwiftDate内存泄漏排查指南&#xff1a;5个Closure与委托模式最佳实践 【免费下载链接】SwiftDate &#x1f414; Toolkit to parse, validate, manipulate, compare and display dates, time & timezones in Swift. 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftD…...

如何免费获取专业级多语言字体:Poppins字体完整使用秘籍

如何免费获取专业级多语言字体&#xff1a;Poppins字体完整使用秘籍 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins Poppins字体是一款完全开源免费的专业级几何无衬线字体&…...

市场比较好的显示屏模块供货商哪家强

市场比较好的显示屏模块供货商推荐在显示屏模块市场&#xff0c;众多企业各展所长&#xff0c;为不同行业提供着优质的产品。以下为您介绍十家市场上表现出色的显示屏模块供货商&#xff1a;杭州斡能电子有限公司&#xff08;杭州斡能&#xff09; 杭州斡能始创于2008年10月&am…...

KITTI数据集实战指南:从下载到3D目标检测全流程解析(附避坑技巧)

KITTI数据集实战指南&#xff1a;从下载到3D目标检测全流程解析&#xff08;附避坑技巧&#xff09; 1. 为什么选择KITTI数据集&#xff1f; 在计算机视觉和自动驾驶研究领域&#xff0c;数据是算法进步的基石。KITTI数据集自2012年发布以来&#xff0c;已成为全球最具影响力的…...

CentOS 7.9 上TDengine 3.0.4.2 二进制安装避坑指南:从下载到压测一条龙

CentOS 7.9 上TDengine 3.0.4.2 二进制安装实战&#xff1a;从零部署到百万级压测全解析 时序数据库正在成为物联网、工业互联网和金融监控等场景的核心基础设施。作为国产时序数据库的佼佼者&#xff0c;TDengine以其卓越的写入性能和压缩比&#xff0c;正在全球范围内获得越…...

PlugY完整指南:暗黑破坏神2终极单机优化解决方案

PlugY完整指南&#xff1a;暗黑破坏神2终极单机优化解决方案 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY PlugY是《暗黑破坏神2&#xff1a;毁灭之王》最强大的单…...