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

数据结构之双向带头循环链表函数功能实现与详细解析

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题       数据结构初阶

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.前言

2.带头双向循环链表函数实现

3.总结


1.前言

        在前面我们写过单链表,循环链表的博客,今天我主要给大家来带关于双向带头循环链表函数的功能与实现,双向带头循环链表相对于单链表,循环链表非常的容易实现,他的函数的功能和 单链表,循环链表一样,如果你想要快速实现一个链表的所有功能,带头双向循环链表非常的容易,接下来让我们看看带头双向链表的奥妙把,看完你绝对会佩服写出这种结构的人。

2.带头双向循环链表函数实现

#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
typedef struct ListNode {int data;struct ListNode* prev, * next;
}ListNode;
ListNode* ListCreate(int x)
{ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));if (newnode == NULL){perror("malloc");return NULL;}newnode->next = NULL;newnode->prev = NULL;newnode->data = x;return newnode;
}
ListNode* LInit()
{ListNode* head = ListCreate(-1);head->next = head;head->prev = head;return head;
}
void ListDestory(ListNode* phead)
{assert(phead);ListNode* cur = phead->next, * prev = phead;while (prev != phead){free(prev);prev = cur;cur = cur->next;}
}
void ListPrint(ListNode* phead)
{assert(phead);ListNode* cur = phead->next;printf("哨兵位<=>");while (cur != phead){printf("%d<=>", cur->data);cur = cur->next;}printf("\n");
}
void ListPushBack(ListNode* phead, int x){assert(phead);ListNode* newnode = ListCreate(x);ListNode* tail = phead->prev;tail->next = newnode;newnode->prev = tail;newnode->next = phead;phead->prev = newnode;
}
void ListPushFrount(ListNode* phead, int x)
{assert(phead);ListNode* newnode = ListCreate(x);ListNode* cur = phead->next;phead->next = newnode;newnode->prev = phead;newnode->next = cur;cur->prev = newnode;
}
void ListPopBack(ListNode* phead)
{assert(phead && phead->next != phead);ListNode* cur = phead->prev;cur->prev->next = phead;phead->prev = cur->prev;free(cur);
}
void ListPopFrount(ListNode* phead)
{assert(phead && phead->next != phead);ListNode* cur = phead->next;phead->next = cur->next;cur->next->prev = phead;free(cur);
}
ListNode* ListFind(ListNode* phead, int x)
{assert(phead);ListNode* cur = phead->next;while (cur->data != x){cur = cur->next;}return cur;
}
void ListInsert(ListNode* pos, int x)
{assert(pos);ListNode* newnode = ListCreate(x);ListNode* cur = pos->prev;cur->next = newnode;newnode->prev = cur;newnode->next = pos;pos->prev = newnode;
}
void ListErase(ListNode* pos)
{assert(pos);ListNode* cur = pos->next;ListNode* prev = pos->prev;free(pos);cur->prev = prev;prev->next = cur;
}
void text1()
{ListNode* head = LInit();ListPushBack(head, 1);ListPushBack(head, 2);ListPushBack(head, 3);ListPushBack(head, 4);ListPushBack(head, 5);ListPushFrount(head, 0);ListPrint(head);ListPopBack(head);ListPrint(head);ListPopBack(head);ListPrint(head);ListPopFrount(head);ListPrint(head);ListPopFrount(head);ListPrint(head);ListPushBack(head, 4);ListPushBack(head, 5);ListNode* cur = ListFind(head,3);ListPushFrount(head, 1);ListPushFrount(head, 0);	printf("%d\n", cur->data);ListPrint(head);ListInsert(head, 10);ListPrint(head);
}

3.总结

        带头双向循环的链表非常的好,接下俩我们对顺序表和链表的存储空间,随机访问,任意位置插入或删除元素,插入,缓存利用率,应用场景进行分析

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

相关文章:

数据结构之双向带头循环链表函数功能实现与详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.带头双…...

SpringBoot_websocket实战

SpringBoot_websocket实战 前言1.websocket入门1.1 websocket最小化配置1.1.1 后端配置1.1.2 前端配置 1.2 websocket使用sockjs1.2.1 后端配置1.2.2 前端配置 1.3 websocket使用stomp协议1.3.1 后端配置1.3.2 前端配置 2.websocket进阶2.1 websocket与stomp有什么区别2.2 webs…...

香港科技大学广州|机器人与自主系统学域博士招生宣讲会—同济大学专场!!!(暨全额奖学金政策)

在机器人和自主系统领域实现全球卓越—机器人与自主系统学域 硬核科研实验室&#xff0c;浓厚创新产学研氛围&#xff01; 教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01; 一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; &#x1f559;时间&#xff1a;…...

python基于GCN(图卷积神经网络模型)和LSTM(长短期记忆神经网络模型)开发构建污染物时间序列预测模型

在以往的时间序列预测建模中广泛使用的是回归类算法模型和RNN类的算法模型&#xff0c;相对来说技术栈会更稳定一些&#xff0c;最近有一个实际业务场景的需求&#xff0c;在建模的过程中要综合考虑其余点位的影响依赖&#xff0c;这时候我想到了之前做过的交通流量和速度预测相…...

SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径&#xff0c;ResponsBody注解的用途SpringMVC启动流程 SpringMVC运行流程 • 客户端&#xff08;浏览器&#xff09;发送请求&#xff0c;直接请求到 DispatcherServlet 。 • DispatcherServlet 根据请求信息调用 …...

【Linux】Linux的常用基本指令

Linux常用基本指令 Linux指令的历史背景前言说明一、 ls 列出文件中的所有内容常用选项 二、pwd 显示当前所在目录进程三、cd 将当前工作目录改变到指定的目录下常用样例 四、touch 1. 更改文档或目录的日期时间 2. 新建一个不存在的文件常用选项 四、mkdir 1. 更改文档或目录的…...

气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品

简介&#xff1a; 气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品包括中国2001~2018年地表短波波段反照率、植被光合有效辐射吸收比、叶面积指数、森林覆盖度和非森林植被覆盖度、地表温度、地表净辐射、地表蒸散发、地上部分自养呼吸、地下部分自养呼吸、总初级…...

定位鼠标悬浮才出现的元素

第一步&#xff1a;按F12进入开发者模式 第二步&#xff1a;点击Sources. 第三步&#xff1a;鼠标进入&#xff0c;触发悬浮框弹出&#xff0c;然后鼠标停止不要移动。 第四步&#xff1a;按F8 或者&#xff08;Ctrl\&#xff09;&#xff0c;正常情况下&#xff0c;此时页…...

【css/vue】使用css变量,在同一个页面根据不同情况改变字号等样式

解决方法是&#xff1a;将 css 的属性使用 v-bind 与 Vue 组件的属性绑定&#xff0c;当组件的属性变化时&#xff0c;css 对应的属性值也就会随之变化&#xff1b; 具体实现代码&#xff1a; <template><div><span class"navTitle">标题名</s…...

在springboot中实现WebSocket协议通信

前面介绍了使用netty实现websocket通信&#xff0c;有些时候&#xff0c;如果我们的服务并不复杂或者连接数并不高&#xff0c;单独搭建一个websocket服务端有些浪费资源&#xff0c;这时候我们就可以在web服务内提供简单的websocket连接支持。其实springboot已经支持了websock…...

云原生Docker系列 | Docker私有镜像仓库公有镜像仓库使用

云原生Docker系列 | Docker私有镜像仓库&公有镜像仓库使用 1. 使用公有云镜像仓库1.1. 阿里云镜像仓库1.2. 华为云镜像仓库1.3. 腾讯云镜像仓库2. 使用Docker Hub镜像仓库3. 使用Harbor构建私有镜像仓库4. 搭建本地Registry镜像仓库1. 使用公有云镜像仓库 1.1. 阿里云镜像…...

用于 syslog 收集的协议:TCP、UDP、RELP

系统日志是从 Linux/Unix 设备和其他网络设备&#xff08;如交换机、路由器和防火墙&#xff09;生成的日志 可以通过将 syslog 聚合到称为 syslog 服务器、syslog 守护程序或 syslogd 的服务器来集中 syslog。在TCP、UDP和RELP协议的帮助下&#xff0c;系统日志从设备传输到系…...

OpenAI创始人山姆·阿尔特曼重返公司;LLM持续学习

&#x1f989; AI新闻 &#x1f680; OpenAI创始人山姆阿尔特曼重返公司并与微软建立合作伙伴关系 摘要&#xff1a;OpenAI创始人山姆阿尔特曼回归OpenAI&#xff0c;担任首席执行官&#xff0c;并与微软建立牢固的合作伙伴关系。这解决了近期的争论&#xff0c;微软对OpenAI…...

Ant Design Pro生产环境部署

Ant Design Pro是通过URL路径前缀/api访问后端服务器&#xff0c;因此在nginx配置以下代理即可。 location / {index.html } location /api {proxy_pass: api.mydomain.com }...

Altium Designer学习笔记10

再次根据图纸进行布局走线&#xff1a; 这个MT2492 建议的布局走线。 那我这边应该是尽量按照该图进行布局&#xff1a; 其中我看到C1的电容的封装使用的是电感的封装&#xff0c;需要进行更换处理&#xff1a; 执行Validate Changes和Execute Changes操作&#xff0c;更新&a…...

ubuntu cutecom串口调试工具使用方法(图形界面)

文章目录 Ubuntu下使用CuteCom进行串口调试使用指南什么是CuteCom&#xff1f;主要特点 安装CuteCom使用APT包管理器从源码编译安装 配置串口CuteCom界面解析&#xff08;启动cutecom&#xff09;使用CuteCom进行数据发送和接收配置串口参数数据接收数据发送 高级功能和技巧流控…...

flink 1.17.1的pom.xml模板

flink 1.17.1的pom.xml模板 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…...

MySql的数据类型和隐式转换

文章目录 一、数据类型1、数值类型1.1、整数类型1.2、浮点1.3、定点DECIMAL 2、时间类型2.1、日期和时间类型占用的存储空间2.2、日期和时间类型表示的范围2.3、日期和时间类型的零值表示 3、文本类型 二、隐式转换参考文章 一、数据类型 1、数值类型 1.1、整数类型 整数名称…...

【开源】基于JAVA的在线课程教学系统

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…...

【Linux】权限理解【文件权限以及目录权限详解、以及umsk程序掩码知识详解】

权限理解 一、Linux权限的概念二、su [用户名] &#xff1a; 切换用户三、Linux权限管理文件&#xff08;一&#xff09;文件访问者的分类&#xff08;人&#xff09;&#xff08;二&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;&#xff08;1&#xff09;第…...

css收集

文章目录自动处理所有间距水平垂直居中多行文本截断,超出省略自动均衡折行竖排文字文字融合效果:active 元素激活状态:first-child 第一个子元素:nth-child() 选择指定的子元素:not() 反向选择器media 响应式媒体查询supports 特性检测查询var() css自定义变量使用calc() 动态值…...

别再死记公式了!用Python动手推导酉空间的内积、距离与度量矩阵

用Python玩转酉空间&#xff1a;从复数内积到量子计算基础 线性代数课本上那些晦涩的复数向量运算&#xff0c;是否让你头疼不已&#xff1f;今天我们将用Python代码彻底拆解酉空间的数学奥秘&#xff0c;让抽象概念变得触手可及。这不是又一篇枯燥的理论文章&#xff0c;而是一…...

AI治理实践:平衡技术价值与社会责任

1. 人工智能治理的核心矛盾当算法开始决定谁获得贷款、医疗资源如何分配、甚至刑事判决的量刑建议时&#xff0c;我们不得不面对一个根本性问题&#xff1a;如何在释放AI技术价值的同时&#xff0c;确保其发展不脱离人类社会的责任框架&#xff1f;过去三年参与金融风控AI落地的…...

手把手教你用Python解析Keil生成的HEX文件,自己写个简易烧录器

用Python解析HEX文件&#xff1a;从格式解析到自制烧录器的实战指南 在嵌入式开发中&#xff0c;HEX文件就像一位沉默的邮差&#xff0c;携带着机器码穿梭于开发环境与硬件之间。不同于BIN文件的"裸奔"风格&#xff0c;HEX文件用精巧的结构封装了数据、地址和校验信息…...

怎样高效掌握Python GUI开发:实用PyQt6实战手册

怎样高效掌握Python GUI开发&#xff1a;实用PyQt6实战手册 【免费下载链接】PyQt-Chinese-tutorial PyQt6中文教程 项目地址: https://gitcode.com/gh_mirrors/py/PyQt-Chinese-tutorial PyQt-Chinese-Tutorial是一份全面的PyQt6中文教程&#xff0c;专为Python开发者和…...

CodeCombat终极指南:在游戏冒险中掌握编程核心技能

CodeCombat终极指南&#xff1a;在游戏冒险中掌握编程核心技能 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 你是否曾想过&#xff0c;学习编程可以像玩游戏一样有趣&#xff1f;想象一下&…...

告别同步折腾!坚果云 × Obsidian 官方同步插件,最强工作流全解析

坚果云 Obsidian 官方同步插件 Nutstore Sync 上架 Obsidian 社区插件市场已经有几个月啦&#xff01; 自从这款同步插件问世后&#xff0c;后台的小伙伴们直呼“终于等到了&#xff01;”、“这下不用折腾了&#xff01;”。经过这几个月的重度使用和时间检验&#xff0c;它…...

Sa-Token V1.31.0 新拦截器实战:在 RuoYi-Vue-Plus 4.3.0 中如何用 @SaIgnore 替换 @Anonymous 提升性能

Sa-Token V1.31.0 拦截器升级实战&#xff1a;RuoYi-Vue-Plus 4.3.0 性能优化指南 最近在重构一个基于 RuoYi-Vue-Plus 4.3.0 的后台管理系统时&#xff0c;发现接口响应速度随着业务增长逐渐变慢。通过性能分析工具定位到权限校验环节存在优化空间&#xff0c;恰逢 Sa-Token 发…...

Verl v0.2终极发布:无Critic强化学习框架如何让训练效率飙升300%?

Verl v0.2终极发布&#xff1a;无Critic强化学习框架如何让训练效率飙升300%&#xff1f; 【免费下载链接】verl verl/HybridFlow: A Flexible and Efficient RL Post-Training Framework 项目地址: https://gitcode.com/GitHub_Trending/ve/verl Verl作为一款灵活高效…...

猫抓Cat-Catch:浏览器资源嗅探扩展的全面高效解决方案

猫抓Cat-Catch&#xff1a;浏览器资源嗅探扩展的全面高效解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓Cat-Catch是一款功能强大的浏…...