11 双向链表

单链表的局限:

在这里插入图片描述
单链表的缺点:逆序访问单链表中的元素耗时大。(时间复杂度:O²)

双向链表的定义

在这里插入图片描述
第0个节点【a1】的pre指针为NULL,要注意
在这里插入图片描述

插入操作:

在这里插入图片描述

删除操作:

在这里插入图片描述

初步实现双链表 代码:

插入代码中要注意:

请添加图片描述
注意:第0个元素的pre指针为NULL

插入的是空双链表中的 第一个元素,示意图:

请添加图片描述

插入的为最后一个元素:

在这里插入图片描述

main.c

//双链表
#include "DLinkList.h"
struct Value
{DLinkListNode header;int v;
};
int main() {int i;DLinkList* list = DLinkList_Create();struct Value v1;struct Value v2;struct Value v3;struct Value v4;struct Value v5;v1.v = 1;v2.v = 2;v3.v = 3;v4.v = 4;v5.v = 5;DLinkList_Insert(list, &v1, DLinkList_Length(list));DLinkList_Insert(list, &v2, DLinkList_Length(list));DLinkList_Insert(list, &v3, DLinkList_Length(list));DLinkList_Insert(list, &v4, DLinkList_Length(list));DLinkList_Insert(list, &v5, DLinkList_Length(list));for ( i = 0; i < DLinkList_Length(list); i++){struct Value* pv = (struct Value*)DLinkList_Get(list, i);printf("%d\n", pv->v);}printf("\n");DLinkList_Delete(list, DLinkList_Length(list) - 1);DLinkList_Delete(list, 0);for (i = 0; i < DLinkList_Length(list); i++){struct Value* pv = (struct Value*)DLinkList_Get(list, i);printf("%d\n", pv->v);}DLinkList_Destory(list);
}

DLinkList.h

#pragma once
#pragma once
#pragma once
#include <stdio.h>typedef void DLinkList;
//定义包含指针next的结构体
typedef struct _tag_DLinkListNode DLinkListNode;
typedef struct _tag_DLinkListNode
{DLinkListNode*  next;DLinkListNode*  pre;
};/*
该方法用于创建并且返回一个空的线性表
*/
DLinkList* DLinkList_Create();/*
该方法用于销毁一个线性表DLinkList
*/
void DLinkList_Destory(DLinkList* list);/*
该方法用于将一个线性表DLinkList中的所有元素清空
使得线性表回到创建时的初始状态
*/
void DLinkList_Clear(DLinkList* list);/*
该方法用于返回一个线性表DLinkList中的所有元素个数
*/
int DLinkList_Length(DLinkList* list);int DLinkList_Capacity(DLinkList* list);/*
该方法用于向一个线性表DLinkList的pos位置处插入新元素node
返回值为1表示插入成功,0表示插入失败
*/
int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos);/*
该方法用于获取一个线性表DLinkList的pos位置处的元素
返回值为pos位置处的元素,NULL表示获取失败
*/
DLinkListNode* DLinkList_Get(DLinkList* list, int pos);/*
该方法用于删除一个线性表DLinkList的pos位置处的元素
返回值为被删除的元素,NULL表示删除失败
*/
DLinkListNode* DLinkList_Delete(DLinkList* list, int pos);

DLinkList.c

#include "DLinkList.h"typedef struct _tag_DLinkList
{DLinkListNode header;//头指针int length;//单链表的长度
}TDLinkList; //类型:既代表头结点,又代表整个单链表DLinkList* DLinkList_Create() {TDLinkList* ret = (TDLinkList*)malloc(sizeof(TDLinkList));if (ret) {ret->length = 0;ret->header.next = NULL;ret->header.pre = NULL;}
}void DLinkList_Destory(DLinkList* list) {free(list);
}void DLinkList_Clear(DLinkList* list) {((TDLinkList*)list)->length = 0;((TDLinkList*)list)->header.next = NULL;((TDLinkList*)list)->header.pre = NULL;}int DLinkList_Length(DLinkList* list) {return ((TDLinkList*)list)->length;
}int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) {TDLinkList* tll = (TDLinkList*)list;int i = 0;int ret = -1;ret = (tll != NULL) && (pos >= 0) && (node != NULL);if (ret) {DLinkListNode* current = (DLinkListNode*)tll;DLinkListNode* next = NULL;//移动current指针到pos位置for (i = 0; (i < pos) && (current->next != NULL); i++){current = current->next;}next = current->next; ////关键current->next = node;//插入的步骤node->next = next;if (next) {next->pre = node;}node->pre = current;//个人认为这个判定条件不对:如果链表原来长度为5,现在要插入第0个位置【即链表第一个节点】,此if的代码不会被执行,//那么第一个节点的pre指针就不能被赋值为NULL,导致问题if (tll->length == 0) {node->pre = NULL; }tll->length++;}return ret;
}DLinkListNode* DLinkList_Get(DLinkList* list, int pos) {TDLinkList* tll = (TDLinkList*)list;DLinkListNode* ret = NULL;int i = 0;if ((tll != NULL) && (pos >= 0) && pos < tll->length) {DLinkListNode* current = (DLinkListNode*)tll;for (i = 0; i < pos; i++){current = current->next;}ret = current->next;}return ret;
}DLinkListNode* DLinkList_Delete(DLinkList* list, int pos) {TDLinkList* tll = (TDLinkList*)list;DLinkListNode* ret = NULL;int i = 0;if ((tll != NULL) && (pos >= 0) && pos < tll->length) {DLinkListNode* current = (DLinkListNode*)tll;DLinkListNode* next = NULL;for (i = 0; i < pos; i++){current = current->next;}ret = current->next;next = ret->next;	current->next = next;//删除的步骤if (next) {next->pre = current;if (current == (DLinkListNode*)tll) { //如果删除的是第一个元素next->pre = NULL;}}tll->length--;}return ret;
}

在这里插入图片描述

最终的代码:

添加“游标”操作

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

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

相关文章

【Vue系列】Vue3快速构建项目,以及在已有代码情况首次打开如何初始化依赖项

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《前端》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌…

一天一个设计模式---适配器模式

概念 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作&#xff0c;使得原本由于接口不匹配而无法合作的类能够一起工作。 具体内容 适配器模式主要包括以下几个要素&#xff1a; 目标接…

C 语言结构体和枚举完全指南:成员访问、字符串操作、枚举基础

访问结构体成员 要访问结构体的成员&#xff0c;请使用点语法 (.): // 创建名为 myStructure 的结构体 struct MyStructure {int myNum;char myLetter; };int main() {// 创建名为 s1 的 myStructure 的结构体变量struct MyStructure s1;// 为 s1 的成员分配值s1.myNum 13;s…

Miniconda Python解释器 Conda 包管理器 Pytorch

Miniconda Miniconda 是一个轻量级的 Anaconda 版本&#xff0c;它是一个用于管理 Python 环境和包的开源工具。Anaconda 是一个数据科学和机器学习的开发环境&#xff0c;它包含了许多常用的 Python 包和工具。 与 Anaconda 相比&#xff0c;Miniconda 的安装包更小&#xf…

VBA中类的解读及应用第八讲:实现定时器功能的自定义类事件

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

Java中输入和输出处理(三)二进制篇

叮咚&#xff01;加油&#xff01;马上学完 读写二进制文件Data DataInputStream类 FilFeInputStream的子类 与FileInputStream类结合使用读取二进制文件 DataOutputStream类 FileOutputStream的子类 与FileOutputStream类结合使用写二进制文件 读写二进制代码 package 面…

vue实现-年、月、日、时、分、秒、星期?

一、文章引导 #mermaid-svg-nP4oT3Y4d6oaxUsg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-icon{fill:#552222;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-text{fill:#552222;stroke:#55222…

Pangolin编译

文章目录 版本编译错误 版本 ubuntu 22 编译 # 复制选择版本&#xff08;ORB SLAM 需要的版本为0.6&#xff09; git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin/ git checkout v0.6# 编译 mkdir build && cd build cmake .. -DCMAKE_INS…

倍福(Bechhoff) CX8090嵌入式PC控制器开发没有想像中的那么难

笔者曾2023年初曾为云南阜外医院新风系统开发自动控制系统。医院所有新风设备和公区照明全部采用倍福嵌入式PC控制器实现智能控制。其中新风和供水计量通过CX8090实现控制&#xff1b;公区照明通过BC9050实现控制&#xff1b;并采用美国邦纳人机界面(THM035B&#xff09;实现远…

树形结构的窗口小部件

这段代码是一个使用Qt框架的C程序&#xff0c;实现了一个树形结构的窗口小部件&#xff08;TreeWidget&#xff09;。以下是主要的解释&#xff1a; #include "treewidget.h" #include "ui_treewidget.h"TreeWidget::TreeWidget(QWidget *parent) : QWidg…

DB2除法的小数位问题(四舍五入问题)以及其他常用的函数

DB2除法的小数位问题&#xff08;四舍五入问题&#xff09;以及其他常用的函数 1. DB2取第一条数据2. DB2 中指定值排序2.1 使用case when2.2 使用decode函数 3. 拼接函数4. 强制转换类型——cast函数5. DB2除法的小数位问题&#xff08;四舍五入问题&#xff09;5.1 关于round…

栈和排序.

给你一个1->n的排列和一个栈&#xff0c;入栈顺序给定 你要在不打乱入栈顺序的情况下&#xff0c;对数组进行从大到小排序 当无法完全排序时&#xff0c;请输出字典序最大的出栈序列 输入 第一行一个数n 第二行n个数&#xff0c;表示入栈的顺序&#xff0c;用空格隔开&…

three.js 关键帧动画

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

用汇编编写加解密函数

1.data段 data db "hello,sam" key db "key" dataLen dword ? endata byte 10 dup(0) dedata byte 10 dup(0) 2.Encryption&#xff08;加密&#xff09; Encryption procpush ebpmov ebp,esp;加密数据长度,循环次数mov ecx,sizeof data;寄存器不够用…

金和OA jc6 GetAttOut SQL注入漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为用户提供一整套标准的办公自动化解决方案,以帮助…

方法 ‘NetWork.call()‘ 的签名与类 ‘Model‘ 中基方法的签名不匹配

方法 ‘NetWork.call()’ 的签名与类 ‘Model’ 中基方法的签名不匹配 这个错误通常出现在 TensorFlow 的 Keras 模型中&#xff0c;表示子类化的模型&#xff08;比如你的 NetWork 类&#xff09;在实现 call 方法时与基类 Model 中定义的 call 方法的签名不匹配。 在这里&am…

语义解析:如何基于SQL去实现自然语言与机器智能连接的桥梁

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 语义解析 定义 作用 语义解析的应用场景 场景一&#xff1a; 场景二&#xff1a; 总结语…

【LeetCode】winter vacation training

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb; 有效的字母异位词&#x…

129基于matlab的粒子群算法、遗传算法、鲸鱼算法、改进鲸鱼算法优化最小二乘支持向量机(lssvm)的gam正则化参数和sig2RBF函数的参数

基于matlab的粒子群算法、遗传算法、鲸鱼算法、改进鲸鱼算法优化最小二乘支持向量机&#xff08;lssvm&#xff09;的gam正则化参数和sig2RBF函数的参数。输出适应度曲线&#xff0c;测试机和训练集准确率。程序已调通&#xff0c;可直接运行。 129 matlabLSSVM优化算法 (xiaoh…

什么是k8s和声明式编程?

认识k8s之后&#xff0c;他的操作模式对我来说是一种很不错的体验。他提供了更接近现实世界的面向对象接口。 什么是k8s&#xff1f; Kubernetes&#xff08;K8s&#xff09;是一种开源容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它简化了容器化应用…