数据结构-2.9.双链表

一.双链表与单链表的对比:


二.双链表的初始化(带头结点):

1.图解:

2.代码演示:

#include<stdio.h>
#include<stdlib.h>
​
//定义双链表结构体
typedef struct DNode
{int data;struct DNode *prior;//前驱指针即指向前面数据的指针 struct DNode *next;//后继指针即指向后面数据的指针 
}DNode,*DLinklist; //DLinklist与DNode *等价,DLinklist强调链表,DNode *强调结点 
​
//初始化双链表
bool InitDLinkList(DLinklist &L)
{L = (DNode *)malloc( sizeof(DNode) );//分配一个头结点if( L==NULL ) //内存不足,分配失败 {return false;} L->prior = NULL;//头结点的prior(前驱)永远指向NULLL->next = NULL;//头结点之后(后继)暂时还没有结点 return true;
} 
​
//判断双链表是否为空(带头结点)->只需要看第一个结点是否为空即可 
bool Empty(DLinklist L)
{if( L->next == NULL )//代表双链表第一个结点为空,是空双链表{return true;}else{return false;//代表双链表第一个结点不为空,不是空双链表 }
} 
​
int main()
{//初始化双链表 DLinklist L;InitDLinkList(L);//后续代码。。。 return 0;
}

三.双链表的插入:

图解:

此时要p结点之后插入s结点,起初p->next指向y,先把p的下一个结点即y和要插入的结点即s的指向下一个结点的指针对接即s->next = p->next:

之后还需要把p结点的后继结点即p->next的前向指针p->next->prior指向s即p->next->prior = s:

再把要插入的结点即s结点的前驱指针指向p结点即 s->prior = p:

最后把p结点的后继结点指向s即p->next = s:

但对于上述代码,有一个bug,当p结点是最后一个结点时,p->next->prior = s就会报空指针的错,因为

p结点是最后一个结点时p->next指向NULL,因此,严谨的代码如下:对p->next进行空指针判断

  • 按位序插入:找到要插入的位序的前驱结点,在该结点实现后插操作即可

  • 前插操作:由于双链表的特性,可以很方便的找到给定结点的前驱结点,再对前驱结点进行后插操作即可


四.双链表的删除:

图解:

此时要删除p结点的后继结点q,因此要把q结点的下一个结点和p结点连接,即p->next = q->next:

再把要删除的q结点的后继结点即q->next的前驱结点即q->next->prior指向p即q->next->prior = p:

最后再释放要删除的q结点即free(q):free函数要用到头文件#include<stdlib.h>

但上述代码也有bug,如果此时要删除的q结点为双链表最后一个结点,那么q->next就指向NULL,q->next->prior就会报空指针错误,因此对q->next进行空指针判断以增加严谨性:

销毁双链表:每一次删除头结点的后继结点即可

因为比如第一次删除头结点的后继结点即第一个结点,第二次删除时第二个结点就来了第一个位置,相当于头结点的后继结点,删除即可,以此类推,可销毁双链表:


五.双链表的遍历:

1.对于前向遍历(跳过头结点)的循环条件当p->prior == NULL时,说明此时p结点指向的就已经是头结点了,此时跳出循

环,不操作头结点了;

2.对于按位查找,只需要添加一个计数器,用于记录此时指向的哪个位置的元素,当位置和要找的位置匹配时打印即可;

3.对于按值查找,只需要对当前指向的结点和要找的值对比即可,找到了就打印即可;

4.双链表没有随机存取的特性,所以按位查找,按值查找的时间复杂度为O(n),因为只能用循环的方式一个一个对比依次

往后找。


六.总结:


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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构~二叉搜索树

文章目录 一、二叉树搜索的概念二、二叉树搜索的结构二叉树搜索的性能分析二叉树搜索的插入二叉树搜索的查找二叉树搜索的删除 三、二叉搜索树key和key/value使用场景四、二叉树搜索的练习将二叉搜索树就地转化为已排序的双向循环链表从前序与中序遍历序列构造二叉树二叉树的前…

2024最新盘点:90%的工厂都在用的仓库管理系统有哪些?

有很多老板看见同行都在用仓库管理系统来管理库存、采购等工作&#xff0c;也想入手一个&#xff0c;但是不知从何下手&#xff0c;又很苦恼怎么才能选择适合自己企业的系统。 不用担心&#xff0c;本篇文章将会从市面上很多老板都在用的WMS系统&#xff0c;从适用范围、核心功…

智能密码、指纹锁语音芯片ic方案 可存放40s语音内容 NVD语音芯片

随着科技的飞速发展&#xff0c;智能家居安全领域迎来了前所未有的变革。智能密码与指纹锁作为现代家庭安全防护的重要一环&#xff0c;其背后的语音芯片IC开发更是这一变革中的关键技术突破。 智能密码、指纹锁语音芯片ic方案 选型与简介&#xff1a; NVD语音芯片是一款低成…

《ESP32调试异常集锦》之:程序编译失败,提示undefined reference to `dedic_gpio_bundle_write‘

项目场景&#xff1a; 硬件&#xff1a;ESP32-LyraT-Mini V1.2开发板&#xff0c;使用的是ESP32-WROVER-E 模组。 程序&#xff1a;基于soft_i2c示例程序修改协议内容实现与TM1640通信测试 问题描述 编译失败&#xff0c;"full clean"后重新编译依旧失败。没有语法…

EasyGBD国标GB28181设备端,支持GB28181-2016、GB28181-2022

功能概要&#xff1a; 功能概述&#xff1a;EasyGBD是GB/T28181 Device的简称&#xff0c;指国标GB28181协议的设备端。EasyGBD功能组件支持Windows、Linux、Android、iOS、ARM等所有平台&#xff0c;可兼容国标GB28181-2011、GB28181-2016的全部功能。 操作系统&#xff1a;任…

SOMEIP_ETS_127: SD_Multicast_FindService

测试目的&#xff1a; 验证DUT能够对10个多播FindService消息做出响应&#xff0c;这些消息每100ms发送一次&#xff0c;请求有效的服务/实例ID&#xff08;取决于DUT&#xff09;&#xff0c;DUT需要使用单播OfferService消息来回答。 描述 本测试用例旨在确保DUT能够正确处…

爆火南卡开放式耳机,音质性能霸榜TOP1,行业唯一达专业HiFi级音质标准!

爆火南卡开放式耳机&#xff0c;音质性能霸榜TOP1&#xff0c;行业唯一达专业HiFi级音质标准&#xff01; 随着科技的不断进步&#xff0c;耳机市场迎来了又一次革命性的创新。南卡&#xff08;NANK&#xff09;品牌近日宣布&#xff0c;其最新力作——南卡Ultra耳夹开放式耳机…

阿里发电预测模型:FusionSF

论文《FusionSF: Fuse Heterogeneous Modalities in a Vector Quantized Framework for Robust Solar Power Forecasting》 目前的研究主要依赖于历史太阳能数据或单模态格式的数值天气预报&#xff0c;忽略了不同模态提供的补充信息。 本文提出一个多模态融合框架&#xff0…

element下拉框联动 或 多选 回显数据后页面操作不生效问题解决

第一种:多选回显不生效 解决方式: 代码: <el-form-item label"系统" prop"Key"> <el-select v-model"addForm.Key" multiple placeholder"请选择" change"$forceUpdate()"> <el-option v-for"item …

史上最详细泛微Ecology9安装教程及安装包(含注册)

在现代企业中&#xff0c;泛微Ecology9 已成为高效的办公自动化管理系统之一&#xff0c;帮助企业在流程管理、信息协同等方面实现快速发展。本篇文章将为您详细介绍泛微Ecology9的安装过程&#xff0c;并提供最新的安装包下载&#xff0c;包含完整的注册信息&#xff0c;助您快…

盲盒小程序|探寻盲盒乐趣,开发专属商城

随着潮流文化的不断发展&#xff0c;盲盒作为一种独特的消费模式&#xff0c;越来越受到年轻人的喜爱。在盲盒玩具的世界里&#xff0c;每一次开启都像是打开神秘宝盒&#xff0c;不知道会有什么惊喜等待着你。无论是收集可爱的公仔&#xff0c;还是寻找珍稀的限定版&#xff0…

Vulnhub:Fowsniff 1

靶机下载地址 信息收集 主机发现 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.134 端口扫描 nmap 192.168.31.134 -A -p- -T4 开放端口22(ssh)、80(http)&#xff0c;和两个明文传输的邮件端口110(pop3)、143(imap)。 HTTP 访问http://192.168.31.134。…

线程池工作原理?

线程池的工作原理&#xff1a; 当任务过来时&#xff0c;如果线程池中的线程数小于核心线程数&#xff0c;就创建线程。&#xff08;默认情况下&#xff0c;线程池不会预先创建线程&#xff0c;但可以配置&#xff09;当核心线程数满了以后&#xff0c;提交过来的任务会放到阻塞…

公司可以看到员工电脑在干嘛吗?四种监控员工电脑的方式

想象一下&#xff0c;你刚打开电脑&#xff0c;准备浏览最新的娱乐新闻&#xff0c;突然想到&#xff1a;“我的老板能看到我在干嘛吗&#xff1f;” 随着企业对工作效率和信息安全的关注日益增加&#xff0c;越来越多的公司开始采用各种方式来监控员工的电脑使用情况。 那么…

Java语言程序设计基础篇_编程练习题**18.38 (递归树)

目录 题目&#xff1a;**18.38 (递归树) 代码示例 代码逻辑解释 类定义和变量初始化 main 方法 start 方法 drawRecursiveTree 方法 输出结果 题目&#xff1a;**18.38 (递归树) 编写一个程序来显示一个递归树&#xff0c;如图18-20所示 代码示例 编程练习题18_38Re…

git push错误:Out of memory, malloc failed (tried toallocate 947912704 bytes)

目录 一、错误截图 二、解决办法 一、错误截图 因项目文件过大&#xff0c;http.postBuffer设置的内存不够&#xff0c;所以报错。 二、解决办法 打开cmd窗口&#xff0c;执行如下命令即可 git config --global http.postBuffer 1024000000 如图所示 执行完成以后&#…

ABAP 学习t-code DWDM

ABAP 学习t-code DWDM &#xff0c;里面有很多例子展示&#xff0c;且能看到源代码

netty编程之我就非得用你,我用Java nio咋就不行?

写在前面 netty啊&#xff0c;我就非得用你&#xff0c;我用Java nio咋就不行&#xff1f; 1&#xff1a;我们都要做什么&#xff1f; 比如我们想要实现一个http的服务器&#xff0c;如果是直接基于Java nio来做的话&#xff0c;就需要来解析http协议&#xff0c;不小的工作…

第十七节 鼠标的操作与相应

知识点 -event代表鼠标事件类型 -EVENT_LBUTTONDOWN鼠标左键按下 -EVENT_LBUTTONUP鼠标左键抬起 -EVENT_LBUTTONMOVE鼠标及移动 Point sp(-1, -1); Point ep(-1, -1); Mat temp; static void on_draw(int event, int x, int y, int flags, void* userdata) { Mat imag…

通过 OBD Demo 体验 OceanBase 4.3 社区版

本文作者&#xff1a;马顺华 引言 OceanBase 4.3 是一个专为实时分析 AP 业务设计的重大更新版本。它基于LSM-Tree架构&#xff0c;引入了列存引擎&#xff0c;实现了行存与列存数据存储的无缝整合。这一版本不仅显著提升了AP场景的查询性能&#xff0c;同时也确保了TP业务场景…