1.3 双向链表定义及部分实现

1.定义

单链表的问题:找后继容易,  找前驱难
双向链表( Double Linked List ) :指的是构成链表的每个结点中设立两个指针域:
一个指向其直接前趋的指针域 prior ,一个指向其直接后继的指针域 next
这样形成的链 表中有两个方向不同的链,故称为双向链表。

将头结点和尾结点链接起来也能构成循环链表,并称之为双向循环链表。

2.部分实现

2.1 结点定义

/*** 单链表的问题:找后继 easy, 找前驱 hard* 双向链表(Double Linked List) :指的是构成链表的每个结点中设立两个指针域:
一个指向其直接前趋的指针域 prior,一个指向其直接后继的指针域 next。
这样形成的链表中有两个方向不同的链,故称为双向链表。*/
typedef struct DoLNode {int data;struct DoLNode *prior, *next;
}DoLNode, *DoLinkList;

2.2 创建结点

/*** 创建一个结点*/
DoLNode* node_create(int data, DoLNode *prior = nullptr, DoLNode* next = nullptr) {DoLNode *node = (DoLNode*)malloc(sizeof(DoLNode));if (node!=nullptr) {node->data = data;node->prior = prior;node->next = next;}return node;
}

2.3创建链表

/*** 创建空的双向链表,返回头结点*/
DoLinkList list_create() {return node_create(0);//return head node
}
/*** 创建双向链表,并以实参列表初始化链表* 调用方法:DoLinkList list = list_create({1,2,3,6,7,8});*/
DoLinkList list_create(std::initializer_list<int> args) {DoLNode *node = node_create(0);//return head nodeif (node == nullptr) {return nullptr;}DoLNode* curr = node;for (int arg : args) {DoLNode *np = node_create(arg, curr, nullptr);curr->next = np;curr = curr->next;}return node;
}
/*测试函数void test1() {DoLinkList list = list_create({1,2,3,6,7,8});list_print(list);}
*/

2.4打印链表

/*** 打印辅助函数*/
bool list_print(DoLinkList list) {if (list == nullptr || list->next == nullptr) return false;printf("[");for (DoLNode* curr = list->next; curr != nullptr; curr = curr->next) {printf("%d", curr->data);printf("%s", curr->next == nullptr ? "" : ",");}printf("]\n");return true;
}
/*测试函数void test1() {DoLinkList list = list_create({1,2,3,6,7,8});list_print(list);list_free(list);}
*/

2.5插入结点

/*** 向链表序号为I的位置插入值为e的结点* 两种方法:前驱插入或后继插入* 与单链表的插入和删除操作不同的是,在双向链表中插入和删除必须同时修改两个方向上的指针域的指向。*/
bool list_insert(DoLinkList list, int i, int e) {if (list == nullptr) {return false;}//[1]定位序号为I的元素位置DoLNode* curr = list;int j = 0;while (j < i) {curr = curr->next;j += 1;}//[2]前驱插入DoLNode* node = node_create(e, curr->prior, curr);curr->prior->next = node;curr->prior = node;return true;
}
/*测试函数void test2() {DoLinkList list = list_create({ 1,2,3,6,7,8 });list_print(list);//[1,2,3,6,7,8]list_insert(list, 2, 9);list_print(list);//[1,9,2,3,6,7,8]list_free(list);}
*/

实现代码中,估计会有一些逻辑漏洞,欢迎指正,谢谢 :)

2.6删除结点

/*** 删除链表中序号为I的结点* 设要删除的结点为 p ,删除时可以不引入新的辅助指针变量,可以直接先断链,再释放结点。语句组如下:p->prior->next=p->next;p->next->prior=p->prior;free(p);*/
bool list_delete(DoLinkList list, int i) {if (list == nullptr || list->next == nullptr) {return false;}DoLNode* curr = list;int j = 0;for (; curr != nullptr && j < i; j++) {curr = curr->next;}if (curr == nullptr || j != i) {//未找到序号I的结点return false;}curr->prior->next = curr->next;curr->next->prior = curr->prior;free(curr);return true;
}
/*测试函数void test3() {DoLinkList list = list_create({ 1,2,3,6,7,8 });list_print(list);//[1,2,3,6,7,8]list_delete(list, 4);list_print(list);//[1,2,3,7,8]list_free(list);}
*/

实现代码中,估计会有一些逻辑漏洞,欢迎指正,谢谢 :)

2.7 默认头文件 

/*** common.h 默认包含头文件*/
#ifndef __IOSTREAM_H__
#define __IOSTREAM_H__
#include <iostream>
#endif#ifndef __STDIO_H__
#define __STDIO_H__
#include <stdio.h>
#endif#ifndef __STDARG_H__
#define __STDARG_H__
#include <stdarg.h>
#endif#ifndef __INITIALIZER_LIST__
#define __INITIALIZER_LIST__
#include <initializer_list>
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tent混沌人工蜂群与粒子群混合算法遇到问题,具体问题及解决方案如文。

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

谷歌再被OpenAI截胡?训练数学AI拿下IMO银牌,不及SearchGPT放了空响..

昨夜谷歌振臂高呼&#xff1a;我们新的数学AI&#xff0c;能在IMO数学竞赛达到银牌水平&#xff01; 但就在谷歌发文的几个小时后&#xff0c;OpenAI就偷了谷歌的家&#xff1a; 发布新的搜索方式SearchGPT &#xff0c;剑指挑战谷歌的搜索引擎。 谷歌双模型并用攻克数学难题…

2. 卷积神经网络无法绕开的神——LeNet

卷积神经网络无法绕开的大神——LeNet 1. 基本架构2. LeNet 53. LeNet 5 代码 1. 基本架构 特征抽取模块可学习的分类器模块 2. LeNet 5 LeNet 5: 5 表示的是5个核心层&#xff0c;2个卷积层&#xff0c;3个全连接层.核心权重层&#xff1a;卷积层、全连接层、循环层&#xff…

LCD 横屏切换为竖屏-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

LCD 横屏切换为竖屏 横屏显示如何切换为竖屏显示 LCD 屏默认横屏显示 开发板配套的 LCD 屏默认都是横屏显示&#xff0c;如 4.3 寸、7 寸和 10.1 寸的不同分辨率的 RGB LCD 屏 固定坐标体系 &#xff08;以 800*480 分辨率为例&#xff09;横屏模式下的固定坐标&#xff1a;…

快醒醒,别睡了!...讲《数据分析pandas库》了—/—<5>

一、 1、修改替换变量值 本质上是如何直接指定单元格的问题&#xff0c;只要能准确定位单元地址&#xff0c;就能够做到准确替换。 1.1 对应数值的替换 具体用法如下&#xff1a; replace方法&#xff1a; df.replace(to_replace None :将被替换的原数值&#xff0c;所有…

【Python机器学习】决策树的构造——信息增益

决策树是最经常使用的数据挖掘算法。它之所以如此流行&#xff0c;一个很重要的原因就是不需要了解机器学习的知识&#xff0c;就能搞明白决策树是如何工作的。 决策树的优缺点&#xff1a; 优点&#xff1a;计算复杂度不高&#xff0c;输出结果易于理解&#xff0c;对中间值的…

linux集群架构--高可用--keepalived(13985字详解)

linux架构高可用 a.概述 高可用&#xff1a;HA HighAvailablity —>Keepalived生成VIP&#xff0c;DNS解析到这个IP地址即可 b.原理 keepalived 是基于VRRP协议实现高可用VRRP虚拟路由器冗余协议&#xff0c;最开始是给网络设备实现高可用&#xff0c;目前keepalive实现v…

项目实战1(30小时精通C++和外挂实战)

项目实战1&#xff08;30小时精通C和外挂实战&#xff09; 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标 这个外挂只针对植物大战僵尸游戏 开发这个外挂&#xff0c;首先要将界面…

GUL图形化界面操作(下部)

目录 ​编辑 前言 Swing 窗口 注意点 新增的组件 进度条组件 开关按钮 多面板和分割面板 多面板 分割面板 ​编辑 选项窗口 对话框带三个选项是&#xff0c;否&#xff0c;取消。 对话框提示输入文本: 前言 修炼中&#xff0c;该篇文章为俺很久前的学习笔记 Swi…

2024钉钉杯A题思路详解

文章目录 一、问题一1.1 问题1.2 模型1.3 目标1.4 思路1.4.1 样本探究1.4.2 数据集特性探究&#xff1a;1.4.3 数据预处理1.4.4 数据趋势可视化1.4.5 ARIMA和LSTM两种预测模型1.4.6 参数调整 二、问题二2.1 问题2.2 模型2.3 目标2.4 思路2.4.1 样本探究2.4.2 数据集特性探究2.4…

Radon(拉当) 变换:超详细讲解(附MATLAB,Python 代码)

Radon 变换 Radon 变换是数学上用于函数或图像的一种积分变换&#xff0c;广泛应用于图像处理领域&#xff0c;尤其是在计算机断层成像 (CT) 中。本文档将详细介绍 Radon 变换的数学含义及其在图像处理中的应用。 数学定义 Radon 变换的数学定义是将二维函数 f ( x , y ) f…

SRTOD

文章目录 AbstractMethodoverviewinnovationsolve Experiment link Abstract 本文主要探讨了在目标检测领域中&#xff0c;如何解决微小物体检测的问题。传统的通用检测器在处理微小物体时性能下降严重&#xff0c;主要是因为难以提取有效的特征。为了解决这个问题&#xff0c…

STL-string(使用和部分模拟实现)

1.string basic_string<char> 是 C 标准库中定义的一个模板类型,用于表示一个字符串。这个模板类接收一个字符类型作为模板参数。typedef basic_string<char> string&#xff1a;string类是basic_string类模板的实例化&#xff0c;它使用 char作为其字符类型。 2.…

狗都能看懂的Actor-Critic强化学习算法讲解

Review Policy Gradient 上面的公式是Policy Gradient的更新函数&#xff0c;这个式子是指在 s t s_t st​时刻采取了 a t a_t at​&#xff0c;计算出对应发生的概率 p θ p_\theta pθ​&#xff0c;然后计算在采取了这个 a t a_t at​之后&#xff0c;所得到的reward有多大。…

优化算法|自适应大邻域搜索算法及MATLAB代码实现

回来填坑了&#xff0c;本篇推文将详细讲解ALNS算法求解VRP问题及MATLAB代码实现。 算法介绍 节约算法构造初始解 function routessaving_init(DistMatrix, Demand, Cap) C_EPS1e-1;Nsize(DistMatrix,1); routescell(numel(2:N),1); for i1:numel(routes) % 每个节点单独一条…

【Django】前端技术HTML常用标签(开发环境vscode)

文章目录 安装两个常用插件HTML常用标签定义文档类型DOCTYPE网页的结构html/head//title/body/div标题h1/h2/h3/h4/h5分割线hr段落 p列表ul/li&#xff0c;ol/li超链接a文本span图片img按钮button表格table&#xff08;table、tr、th、td&#xff09;表单form 安装两个常用插件…

目标检测 YOLOv5-7.0 详细调试自制数据集实战

目标检测 YOLOv5-7.0 详细调试&自制数据集实战 一、项目介绍及环境配置&#xff08;一&#xff09;项目解读&#xff08;二&#xff09;版本选择&#xff08;三&#xff09;环境配置 二、如何利用YOLOv5进行预测&#xff08;detect.py&#xff09;&#xff08;一&#xff0…

Windows 实用小工具:窗口钉子/文件管理 2024/7/27

一: wintop 窗口置顶工具 二:WinDirStat 这是一个免费的、开源的磁盘使用分析工具&#xff0c;适用于Windows系统。它会扫描你的硬盘&#xff0c;列出所有文件和文件夹的大小&#xff0c;并以图形化的方式展示&#xff0c;便于理解。 可以用来检测硬盘文件夹占用从而,酌情处…

JAVA.抽象、接口、内部类

1.抽象 共性&#xff0c;父类定义抽象方法&#xff0c;子类必须重写&#xff0c;或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat&#xff0c;子类必须重写public abs…