双链表算法库构建

v1.0 : 模仿贺利坚老师, 进行基本构建

贺老师链接:数据结构之自建算法库——双链表_双链表画法-CSDN博客

我的解析博客:双链表的存储结构_p = (*q)->next;-CSDN博客

库函数:

//(1)初始化双链表
void InitDoubleLinkList(DoubleLinkList *&L);//(2)输出双链表
void Dispaly_DoubleLinkList(DoubleLinkList *L);//(3)双链表头插法建表
void CreateDoubleLinkList_Head(DoubleLinkList *&L,ElemType Array_used[],int Array_size);//(4)双链表尾插法建表
void CreateDoubleLinkList_Tail(DoubleLinkList *&L,ElemType Array_used[],int Array_size);//(5)销毁双链表
void DestroyDoubleLinkList(DoubleLinkList *&L);//(6)判断双链表是否为空
bool DoubleLinkList_Empty(DoubleLinkList *L);//(7)求双链表长度
int DoubleLinkList_Length(DoubleLinkList *L);//(8)  获取双链表特定位置的节点值
bool GetDoubleLinkListLocate_value(DoubleLinkList *L, int specific_locate, ElemType &value);//(9)   查找一个特定值的节点,并返回其位置
int  FindDoubleLinkListValue_Location(DoubleLinkList *L, ElemType specific_value);//(10)  插入一个节点到双链表的特定位置
bool Insert_DoubleLinkList(DoubleLinkList *&L, int specific_location, ElemType insert_value);//(11) 删除双链表的特定位置的节点,并取其值
bool Delete_DoubleLinkList_Locate(DoubleLinkList *&L, int specific_locate, ElemType &delete_value);

根据所需进行使用

源文件如下:

DoubleLinkList.h

#ifndef DOUBLELINKLIST_H_INCLUDED
#define DOUBLELINKLIST_H_INCLUDEDtypedef int ElemType;typedef struct DoubleNode
{ElemType data;struct DoubleNode *prior;struct DoubleNode *next;
}DoubleLinkList;//(1)初始化双链表
void InitDoubleLinkList(DoubleLinkList *&L);//(2)输出双链表
void Dispaly_DoubleLinkList(DoubleLinkList *L);//(3)双链表头插法建表
void CreateDoubleLinkList_Head(DoubleLinkList *&L,ElemType Array_used[],int Array_size);//(4)双链表尾插法建表
void CreateDoubleLinkList_Tail(DoubleLinkList *&L,ElemType Array_used[],int Array_size);//(5)销毁双链表
void DestroyDoubleLinkList(DoubleLinkList *&L);//(6)判断双链表是否为空
bool DoubleLinkList_Empty(DoubleLinkList *L);//(7)求双链表长度
int DoubleLinkList_Length(DoubleLinkList *L);//(8)  获取双链表特定位置的节点值
bool GetDoubleLinkListLocate_value(DoubleLinkList *L, int specific_locate, ElemType &value);//(9)   查找一个特定值的节点,并返回其位置
int  FindDoubleLinkListValue_Location(DoubleLinkList *L, ElemType specific_value);//(10)  插入一个节点到双链表的特定位置
bool Insert_DoubleLinkList(DoubleLinkList *&L, int specific_location, ElemType insert_value);//(11) 删除双链表的特定位置的节点,并取其值
bool Delete_DoubleLinkList_Locate(DoubleLinkList *&L, int specific_locate, ElemType &delete_value);#endif // DOUBLELINKLIST_H_INCLUDED

DoubleLinkList.cpp

#include "DoubleLinkList.h"
#include "malloc.h"
#include "stdio.h"
/*****************************************
功  能: 双链表库函数
编程人: 王涛
时  间: 2024.4.1
版  本: V1.0
******************************************//**************************************************
(1)函数名: InitDoubleLinkList
功  能: 初始化双链表
参  数: ①DoubleLinkList *&L: 要进行初始化的双链表
返回值: 无
**************************************************/
void InitDoubleLinkList(DoubleLinkList *&L)
{L = (DoubleLinkList*)malloc(sizeof(DoubleLinkList));L->prior = NULL;L->next = NULL;
}
/**************************************************
(2)函数名: Dispaly_DoubleLinkList
功  能: 输出展示双链表
参  数: DoubleLinkList *L:要展示的双链表
注意: ① 这里是 刷一下存在感
返回值: 无
**************************************************/
void Dispaly_DoubleLinkList(DoubleLinkList *L)
{DoubleLinkList *showNode = L->next;if(L->next == NULL)                    //①{printf("Hey, this is empty!");}while(showNode != NULL){printf("%d",showNode->data);printf(" ");showNode = showNode->next;}printf("\n");}/**************************************************
(3)函数名:CreateDoubleLinkList_Head
功  能: 双链表头插法建表
参  数: ①DoubleLinkList *&L:要建立在的链表上②ElemType Array_used[]: 要使用的数组③int Array_size : 数组的大小
返回值:  void
**************************************************/void CreateDoubleLinkList_Head(DoubleLinkList *&L,ElemType Array_used[],int Array_size)
{DoubleLinkList *newNode;L= (DoubleLinkList *)malloc(sizeof(DoubleLinkList));L->prior = NULL;L->next = NULL;//遍历数组,创建新节点,进而头插法插入for(int i = 0; i < Array_size; i++){newNode = (DoubleLinkList*)malloc(sizeof(DoubleLinkList));newNode->data = Array_used[i];newNode->next = L->next;if(L->next != NULL)//L->next的前驱是否需操作{L->next->prior = newNode;}L->next = newNode;newNode->prior = L;}}/**************************************************
(4)函数名:CreateDoubleLinkList_Tail
功  能: 双链表尾插法建表
参  数: ①DoubleLinkList *&L:要建立在的链表上②ElemType Array_used[]: 要使用的数组③int Array_size : 数组的大小
返回值:  void
**************************************************/
void CreateDoubleLinkList_Tail(DoubleLinkList *&L,ElemType Array_used[],int Array_size)
{DoubleLinkList *newNode,*tailNode;L = (DoubleLinkList*)malloc(sizeof(DoubleLinkList));tailNode = L;for(int i = 0; i < Array_size; i++){newNode = (DoubleLinkList*)malloc(sizeof(DoubleLinkList));newNode->data = Array_used[i];tailNode->next = newNode;newNode->prior = tailNode;tailNode = newNode;}tailNode->next = NULL;}
/**************************************************
(5)函数名: DestroyDoubleLinkList
功  能: 销毁双链表
参  数: DoubleLinkList *&L:将要销毁的双链表
注 意:   ①避免销毁后的L变成的野指针, 再次被误用时, 指针飘飞
返回值: 无
**************************************************/void DestroyDoubleLinkList(DoubleLinkList *&L)
{DoubleLinkList *freeNode;DoubleLinkList *backNode;freeNode = L;backNode = freeNode->next;while(backNode != NULL){free(freeNode);freeNode = backNode;backNode = freeNode->next;}free(freeNode);L->next = NULL; //①
}
/**************************************************
(6)函数名: DoubleLinkList_Empty
功  能: 判断双链表是否为空
参  数: DoubleLinkList *L:要判断的双链表
返回值: bool: 是否为空? true:false
**************************************************/
bool DoubleLinkList_Empty(DoubleLinkList *L)
{return (L->next == NULL);
}/**************************************************
函数名: DoubleLinkList_Length
功  能: 求双链表数据节点长度
参  数: DoubleLinkList *L:要计算的双链表
返回值: int : 节点长度(数据节点,头结点不算)
**************************************************/
int DoubleLinkList_Length(DoubleLinkList *L)
{int nowLength = 0;DoubleLinkList *visit_Node = L;while(visit_Node->next != NULL){nowLength++;visit_Node = visit_Node->next;if(nowLength > 1000){return -1;}}return (nowLength);}
/**************************************************
函数名: GetDoubleLinkListLocate_value
功  能: 获取双链表特定位置的节点值
参  数: (1)DoubleLinkList *L: 要遍历的双链表(2)int specific_locate: 特定的位置(3)ElemType &value: 回调存储节点值
返回值: bool:是否获得所需位置的节点值? true:false
**************************************************/
bool GetDoubleLinkListLocate_value(DoubleLinkList *L, int specific_locate, ElemType &value)
{int nowLocate = 0;DoubleLinkList *nowNode = L;while(nowLocate < specific_locate && nowNode != NULL){nowLocate++;nowNode = nowNode->next;}if(nowNode == NULL){return false;}else{value = nowNode->data;return true;}}
/**************************************************
函数名:FindDoubleLinkListValue_Location
功  能: 查找一个特定值的节点,并返回其位置
参  数:(1)DoubleLinkList *L: 查找的双链表(2)ElemType specific_value: 需要查找的特定值
返回值: int : 特定的位置(0: 没找到 , 大于0:找到)
**************************************************/
int  FindDoubleLinkListValue_Location(DoubleLinkList *L, ElemType specific_value)
{int nowLocate = 1;DoubleLinkList *nowNode = L->next;while(nowNode != NULL && nowNode->data != specific_value){nowLocate++;nowNode = nowNode->next;}if(nowNode == NULL){return 0;}else{return nowLocate;}
}
/**************************************************
函数名: Insert_DoubleLinkList
功  能: 插入一个节点到双链表的特定位置
参  数: (1)DoubleLinkList *&L:要插到的双链表(2)int specific_location: 要插入的位置(3)ElemType insert_value: 要插入的新节点的值
返回值: bool: 是否找到特定位置,并插入? true找到:false没找到
**************************************************/
bool Insert_DoubleLinkList(DoubleLinkList *&L, int specific_location, ElemType insert_value)
{int nowLocate = 0;DoubleLinkList *nowNode = L;DoubleLinkList *newNode;//找到第 specific_location-1个位置,把节点插其后while(nowLocate < (specific_location - 1) && nowNode != NULL){nowLocate++;nowNode = nowNode->next;}if(nowNode == NULL)//未找到第specific_location-1个位置{return false;}else    //找到此位置,插入{newNode = (DoubleLinkList*)malloc(sizeof(DoubleLinkList));newNode->data = insert_value;//双链表节点插入newNode->next = nowNode->next;//找到第specific_location-1个位置,但其后面不一定存在节点if(nowNode->next != NULL){nowNode->next->prior = newNode;}nowNode->next = newNode;newNode->prior = nowNode;return true;}
}
/**************************************************
函数名: Delete_DoubleLinkList_Locate
功  能: 删除双链表的特定位置的节点,并取其值
参  数: (1)DoubleLinkList *&L:要删除的双链表(2)int specific_locate: 要删除的特定位置(3)ElemType &delete_value: 回调已经删除的节点的值
注 意  : ①由于是双链表, 我们要找的位置是specific_locate -1②判断specific_locate -1位置节点是否存在不仅仅需要找到(specific_locate -1), 我们还需要判断specific_locate位置节点是否存在
返回值:  bool:是否找到特定位置,并删除? true:false
**************************************************/
bool Delete_DoubleLinkList_Locate(DoubleLinkList *&L, int specific_locate, ElemType &delete_value)
{int nowLocate = 0;DoubleLinkList *nowNode = L;DoubleLinkList *deleteNode;while(nowLocate < (specific_locate-1) &&  nowNode != NULL)//①{nowLocate++;nowNode = nowNode->next;}//②判断specific_locate -1和specific_locate位置节点是否存在if(nowNode == NULL || nowNode->next == NULL){return false;}else{deleteNode = nowNode->next;delete_value = deleteNode->data;nowNode->next = deleteNode->next;//链接后续节点,从链表中删除deleteNodeif(nowNode->next != NULL)       //判断是否需要管后继节点的前驱指针{nowNode->next->prior = nowNode;}free(deleteNode);return true;}}

主函数调用

main.cpp

#include <stdio.h>
#include "DoubleLinkList.h"int main()
{DoubleLinkList *A,*B;ElemType elem;ElemType a[] = {1,2,3,4,5,6,7,8};CreateDoubleLinkList_Head(B,a,8);Dispaly_DoubleLinkList(B);if(GetDoubleLinkListLocate_value(B,3,elem)){printf("B的第3个元素是%d\n",elem);}printf("3在B中是第%d个元素\n",FindDoubleLinkListValue_Location(B,3));if(Insert_DoubleLinkList(B,5, 100)){printf("插入成功了");Dispaly_DoubleLinkList(B);}if(Delete_DoubleLinkList_Locate(B, 5, elem)){printf("成功删除了B中的第5个元素%d\n",elem);Dispaly_DoubleLinkList(B);}}

运行结果:

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

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

相关文章

Pots(DFS BFS)

//新生训练 #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef pair<int, int> PII; const int N 205; int n, m; int l; int A, B, C; int dis[N][N];struct node {int px, py, op…

解决虚拟机centos8无法连接外网,ping: www.baidu.com: 未知的名称或服务

设置的虚拟机刚开还是好好的&#xff0c;改完hostname重启后就连不上网了 ping百度时显示未知的名称或服务。 1.找到虚拟机的IP(NAT模式的) 编辑-->虚拟网络编辑器 可以看到我的子网IP为192.168.47.0 2.编辑网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-XXXXX…

ZCC5600 锂电转干电池充放电管理芯片 低功耗

特性 内置多档位电压电流调节的线性充电器 ■ 16V 输入耐压 ■ 充电电流和充电电压外部电阻调节 ■ 支持 4.2V/4.3V/4.35V/4.4V 锂电池充电 ■ 400mA/600mA/800mA/1000mA 可配置充电电流 ■ 符合锂电池充电 JEITA 标准&#xff0c;根据电池温度和输入电压智能调节充电电压和充电…

SpringCloud学习(1)-consul

consul下载安装及使用 1.consul简介 Consul是一种开源的、分布式的服务发现和配置管理工具&#xff0c;能够帮助开发人员构建和管理现代化的分布式系统。它提供了一套完整的功能&#xff0c;包括服务注册与发现、健康检查、KV存储、多数据中心支持等&#xff0c;可以帮助开发人…

Redis的高可用(主从复制、哨兵模式、集群)的概述及部署

目录 一、Redis主从复制 1、Redis的主从复制的概念 2、Redis主从复制的作用 ①数据冗余&#xff1a; ②故障恢复&#xff1a; ③负载均衡&#xff1a; ④高可用基石&#xff1a; 3、Redis主从复制的流程 4、Redis主从复制的搭建 4.1、配置环境以及安装包 4.2所有主机…

设计模式-行为型-中介者模式-Mediator

同事抽象类 public abstract class Colleague {private Mediator mediator;public abstract void play(String data); } 视频同事 public class AudioColleague extends Colleague {public void play(String data) {System.out.println("画外音是&#xff1a;" d…

嵌入式开发中状态模式实现

文章目录 状态模式代码实现代码解释小结 状态模式 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变它的行为。在嵌入式系统中&#xff0c;状态模式尤其适用于那些根据外部事件或内部条件频繁改变状态并且每种状态…

最新408试卷分析+备考经验分享

408出题再糟糕&#xff0c;你是不是还是要考&#xff1f; 别管出题人出多刁钻的题&#xff0c;大家拿到的卷子都是一样的&#xff0c;要难就都难&#xff0c;要刁钻就一起g... 所以再潜心钻研出题规律或出题套路&#xff0c;不如多花些时间去多复习巩固几遍知识点&#xff01…

ncurses库:一个框架例程源码

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 折腾过字符界面下的图形化显示…

3D雷达和相机联合标定:一种灵活且精确的基于目标的外参标定方法

3D雷达和相机联合标定&#xff1a;一种灵活且精确的基于目标的外参标定方法 论文链接&#xff1a;https://arxiv.org/pdf/2307.15264.pdf 附赠自动驾驶学习资料和量产经验&#xff1a;链接 摘要 本文介绍了3D雷达和相机联合标定&#xff1a;一种灵活且精确的基于目标的外参…

精通并发【基础三】:线程安全有哪些思路

不可变 final无锁编程&#xff0c;将数据处理映射到指定的线程中处理ThreadLocal互斥&#xff08;SyncReentrantLockCAS&#xff09; 在多线程编程中&#xff0c;线程安全是指当多个线程访问某个类时&#xff0c;这个类始终能表现出正确的行为。实现线程安全可以通过多种方式&…

Android 10.0 双sim卡区分SIM卡1和SIM卡2来电通知功能实现

1.前言 在10.0的rom系统定制化开发中,在一些产品支持双卡双待的功能中,如果两张sim卡都是移动卡,在来电通知中,就不容易区分 到底是哪张sim卡来的电话信息都显示移动信息 所以为了区分sim卡就需要在sim描述的时候 添加是哪张sim卡,接下来就来实现 这些功能 2.双sim卡区…

【C++】编程规范之表达式原则

表达式中变量的位置 在编写表达式时&#xff0c;将变量放置在右边&#xff0c;可以提高代码的可读性和可理解性。这种做法符合自然语言的阅读习惯&#xff0c;使得代码更易于理解。 // Good if (5 x) {// do something }// Avoid if (x 5) {// do something }不变量和资源申…

WPF中动画教程(DoubleAnimation的基本使用)

实现效果 今天以一个交互式小球的例子跟大家分享一下wpf动画中DoubleAnimation的基本使用。该小球会移动到我们鼠标左键或右键点击的地方。 该示例的实现效果如下所示&#xff1a; 页面设计 xaml如下所示&#xff1a; <Window x:Class"AnimationDemo.MainWindow&qu…

vue使用iview导航栏Menu activeName不生效

activeName不生效 一、问题一、解决方案&#xff0c; 一、问题 根据ivew官网的提示&#xff0c;设置了active-name和open-names以后&#xff0c;发现不管是设置静态是数据还是设置动态的数据&#xff0c;都不生效 一、解决方案&#xff0c; 在设置动态名称的时候&#xff0c…

【Erlang】Linux(CentOS7)安装Erlang和RabbitMQ

一、系统环境 查版本对应&#xff0c;CentOS-7&#xff0c;选择Erlang 23.3.4&#xff0c;RabbitMQ 3.9.16 二、操作步骤 安装 Erlang repository curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash安装 Erlang package s…

Yocto理论基础之layer

Yocto理论基础之layer 一、layer介绍二、layer最佳实践三、创建layer 一、layer介绍 在poky源码中我们基本上在每一个meta layer中都能看到一个layer.conf,里面大致内容如下&#xff1a; # We have a conf and classes directory, add to BBPATH BBPATH . ":${LAYERDIR}…

如何使用Python进行文件读写操作?

如何使用Python进行文件读写操作&#xff1f; Python是一种功能强大的编程语言&#xff0c;它提供了丰富的库和工具&#xff0c;使得文件读写操作变得简单而高效。在Python中&#xff0c;可以使用内置的open()函数来进行文件读写操作。下面将详细介绍如何使用Python进行文件读…

【SpringCloud】Ribbon 负载均衡

目 录 一.负载均衡原理二.源码跟踪1. LoadBalancerIntercepor2. LoadBalancerClient3. 负载均衡策略 IRule4. 总结 三.负载均衡策略1.负载均衡策略2.自定义负载均衡策略 四.饥饿加载 在 order-service 中 添加了 LoadBalanced 注解&#xff0c;即可实现负载均衡功能&#xff0c…

Mysql数据库的存储引擎的区别

MyISAM引擎 MyISAM是MySQL的默认数据库引擎&#xff08;5.5版之前&#xff09;。虽然性能极佳&#xff0c;而且提供了大量的特性&#xff0c;包括全文索引、压缩、空间函数等&#xff0c;但MyISAM不支持事务和行级锁&#xff0c;而且最大的缺陷就是崩溃后无法安全恢复。 Inno…