双链表-详细解释,图文并茂

数据结构与算法之美 | 单链表、双链表的增删改查(C++) 本系列内容专为课程面向笔/面试的《数据结构与算法》总结性精讲开设,以图文并茂的方式讲解数据结构,让大家打牢基础,促进对课程内容的掌握,最后做到题解大神,大厂offer拿到手软! 单链表、双链表的增删改查0. 数据结构图文解析系列1. 线性表简介2. 单链表2.1 单向链表的节点结构2.2 单向链表的抽象数据结构2.3 单链表添加节点2.4 单链表删除节点2.5 单链表代码测试3. 双向链表3.1 ...... 阅读详情

转载 http://blog.sina.com.cn/s/blog_7d44748b01013fsf.html

网上很多对双向链表解释的文章都是用这个结构:

 

它们的连接情况是这样的:

相当的不直观,今天我要从详细的地址出发来解释双向链表的原理。

现定义一个结构体如下:

struct student

{

    char name;

    struct student *next;

    struct student *prior;

};

现在有5个人A,B,C,D,E.这五个人构成的链表如下:

虚线部分为地址值,这个是为了描述方便随便写的值,在创建上述的链表时其实不用关心地址值到底是多少,这些地址都会放到某个变量当中,只要对变量进行赋值传递就能实现链表的构建。这里完全是为了分析才这么写的。从图中很容易看出蓝色的箭头组成了一个单链表,红色的箭头又组成了一个单链表(逆向的)。

下面将分析链表的前插与删除的例子,理解了这两个功能,其他的功能都能自己分析出来了。

双链表的前插,下面这是代码和代码分析。

void InsertBefore(student *p,char x)
{  // 在带头结点的双链表中,将值为x的新结点插入*p之前,设p≠NULL
       student *s = malloc(sizeof(student));  // 申请一段内存空间,指针指向首地址0x0600
       s->name = x;  // 定义name为G
       s->prior = p->prior;  // p->prior表示0x0500,将它赋给s->prior表示s->prior里面的值是0x0500,从而指向0x0500这个地址即q,如红线
       s->next = p;  // p是0x0700,将它赋给s->next,s->next中的值为0x0700,也即s->next指向了p,如蓝色线
       p->prior->next = s;  // p->prior 是0x0500,即指针q所指,所以p->prior->next相当于没插入s之前的0x0700,插入s后,将s的首地址即0x0600赋给这个位置,所以此时,由q到p的蓝线断裂,这个蓝线目标变成了s,此时q->next值为0x0600,
       p->prior = s;  // 同理,p->prior也指向了s,即p->prior中0x0500变成了0x0600,红线断裂且目标变成了s,至此前插完成。
} 

下面再分析删除,删除比较简单,代码如下:

void DeleteNode(student *p)
{  // 在带头结点的双链表中,删除结点*p,设*p为非终端结点
         p->prior->next=p->next;  // 将p->next即0x0700送到q->next中,即0x0500被替换成了0x0700,如紫线。
         p->next->prior=p->prior;  // p->prior为0x0300送到了s->prior即原本是0x0500的地方,如绿线。
         free(p);  // 将p内存释放,同时将之前的四根红蓝线全部断裂,至此完成删除任务。 

}

看图轻松理解数据结构与算法系列(双向链表) 前言 推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。 双向链表 双向链表属于链表的一种,也叫双链表双向即是说它的链接方向是双向的,它由若干个节点组成,每个节点都包含下一个节点和上一个节点的指针,所以从双向链表的任意节点开始,都能很方便访问他的前驱结... 阅读详情

相关推荐

用Python实现四叉树(quad tree)

import numpy as np #正方形类 class square: #lx、ly为左上角坐标(x对应行号,y对应列号),rx、ry为右下角坐标 def __init__(self,lx,ly,rx,ry): self.lx=lx self.ly=ly self.rx=rx self.ry=ry #检查该矩阵中是否满足条件 #参数:原矩阵,阈值 #返回值:布尔类型 def check(s

weixin_44164489的博客 5868

双向链表的结点增删细节(p->next->prior = s是啥意思,p->next->prior究竟代表下一个结点的prior指针还是p本身)

p->next->prior = s是啥意思,p->next->prior究竟代表下一个结点的prior指针还是p本身?p->prior->next=p->next和p->next->prior=p->prior是什么意思?

fly_view的博客 5843

[LVGL] 刷新率优化

实验硬件:STM32F407ZGT6;2.4寸TFT-LCD模块(ILI9341驱动芯片、XTP2046触摸芯片)本文目标:lvgl的刷新率优化,解决拉帘子问题注意:本文在LVGL显示触摸代码移植完成的基础上进行,第一次使用lvgl可根据前文一步步移植,点击下方传送门查看相关文章传送门:STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(一)STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(二)[LVGL] 显示代码移植 基于STM32F4。

2301_77117901的博客 2784

双向链表(十一)

双向链表 单链表寻找某结点的前驱结点时,必须遍历一遍链表,最坏的时间复杂度 O ( n ) O(n)O(n) 而双向链表可以直接寻找某结点的前驱结点 1.双向链表的某结点 用指向某结点的指针p代表该结点 结点p的后继的前驱等于结点p本身 结点p的前驱的后继等于结点p本身 p = p->prior->next p = p->next->prior 2.非空的带头结点的双向链表 3.双向链表中元素的插入操作 插入操作图解分步: 第一步: s-&...

Android系统攻城狮 2960

pagerank算法详解

目录一、pagerank定义两个重要假设二、pagerank算法公式定义计算演示矩阵化计算三、存在的两个问题问题1.Dead Ends问题2.Spider Traps 一、pagerank定义 入链数:指向该节点的链接数 出链数:由该节点指出的链接数 以上图为例:A的入链数为1,出链数为3,所以将由A指向其他节点的边权重设置为1/3,表示A访问B、C、D节点的概率均为1/3 两个重要假设 数量假设:在Web图模型中,如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要。 质量假设:指向

gary101818的博客 4万+

如何加载交易策略EA到MT4/MT5

1、打开MT4/MT5软件 2、首先,必须有一个EA,而且必须是mq4/ex4为扩展名。点击左上角“文件”—“打开数据文件夹”,找到安装路径 3、将EA的ex4或mq4文件放到MT4目录\MQL4\Experts里面(本文以名为Demo的EA为例) 4、如果有DLL库文件,复制到experts目录下的libraries子目录中 5、如果有tpl模板文件,复制到templates目录中 6、添加完成后重启MT4,点击允许EA运行图标 7、在导航中找到刚才安装的EA,拖拽到...

weixin_41364817的博客 7362

双链表的存储结构

首先 建立头结点。

qq_57484399的博客 1907

售货机非现金支付开发指南:MDB协议下VPOS刷卡器的那些坑

本文深入探讨了MDB协议下非现金支付设备的开发实践,重点解析了NAYAX VPOS刷卡器的集成难点与解决方案。从RS232通信参数配置到Always idle功能实现,提供了一套完整的售货机支付系统开发指南,帮助开发者规避常见陷阱,提升设备兼容性与交易稳定性。

weixin_29258297的博客 135

双向链表的基本操作

已知P结点是某双向链表的中间结点: 1.在P结点后插入S结点 S->next = P->next; P->next->prior = S; S->prior = P; P->next = S; 2.在P结点前插入S结点 S->prior = P->prior; P->prior->next = S; S-&...

fu_jian_ping的博客 1834

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

博主基于https://github.com/hpc203/GroundingDINO-onnxrun项目分享的onnx c++推理代码,修改为GroundingDINO模型的tensorrt推理代码。对于600x400的输入,在3060显卡下,cuda 12.1,TensorRT-10.4.0,window环境下53ms处理完一张图片。

a486259的博客 1221

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(1)- UCI架构和通用数据包头

如果大家学习过WiFi的SPEC,比如从我的资源里面下载 IEEE 802.11-2007,应该很容易发现,FiRa的spec定义实在是太差了。有现成的好例子不学,非得自己来一套,搞一堆新的名词,其实都是一个意思。比如GID,OID等,而且GID、OID是最先出现的,但是对应表格 还得去附件的最后一项去找。 FiRa是UWB联盟,希望跟WIFi联盟学习一下,把UWB做大做强,而不是自成一派,自命不凡。

Ankie资深技术项目经理 2435

双链表的概念及其基本操作(C++)

双链表的概念的及其基本操作

smart_jackli的博客 577

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景,同时使用 OpenCV-Python 实战讲解图像处理基础要点。

盼小辉丶的博客 27万+

【数据结构】 链表 + 手动实现单链表和双链表的接口(图文并茂附完整源码)

/创建单链表的一个节点DateType x;//指向下一个节点的指针}SLT;节点中有两个变量,一个用来存储数据,一个用来存储下一个节点的地址。由于next指针指向下一个节点,所以next为struct SList* 类型的指针变量。用typedef关键字来重定义,既方便我们修改,也方便我们书写。双向链表中有一个存储Dateype类型的数据的变脸,一个用来指向下一个节点的指针next,还有一个用来指向上一个节点的指针prev。//定义双向链表(带头双向循环链表)的一个节点//指向前一个节点。

Miun123的博客 1256

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[图文并茂]C++线性表及其逻辑结构

线性表是具有相同特性的数据元素的一个有限序列对应的逻辑结构图形:从线性表的定义中可以看出它的特性:(1)有穷性:一个线性表中的元素个数是有限的(2)一致性:一个线性表中所有元素的性质相同,即数据类型相同(3)序列性:各个元素的相对位置是线性的线性表是一种基础且重要的数据结构,常见的线性表有三种实现方式:顺序表、单链表和双链表。​ 本文对这三种线性表的实现方式及特点做一个简要总结:一、顺序表顺序表是将逻辑顺序上相邻的数据元素存储在物理位置上也相邻的存储单元中,通常使用数组来实现。

m0_73421035的博客 544

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

图文并茂用地址分析双向链表

图文并茂用地址分析双向链表 (2012-03-26 18:28:35) 转载▼ 标签: 双向链表 it 分类:unix和linux 网上很多对双向链表解释的文章都是用这个结构:   它们的连接情况是这样的:   相当的不直观,今天我要从详细的地址出发来解释双向链表的原理。   现定义一个结构体如下: structstude

nicehuai 614

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

HashMap与LinkedHashMap底层存储原理详解

HashMap底层存储原理 :https://www.jianshu.com/p/dde9b12343c1 LinkedHashMap底层存储原理 :https://www.jianshu.com/p/8f4f58b4b8ab 如下是关于LinkedHashMap的双链表结构的附加图解(这个图是解释双链表是如何存储的,结合上述链接文章的图一起看): ...

Rango_kjc的博客 317

FreeRTOS 链表的深度讲解

list.h里定义 /*节点结构体定义*/ struct xLIST_ITEM { TickType_t xItemValue; //辅助值,用于帮助节点做顺序排列 struct xLIST_ITEM * pxNext; struct xLIST_ITEM * pxPrevious; void * pvOwner; void * ...

oDuanYanGuHong的博客 894

图文并茂用地址分析双向链表(很清晰!)

网上很多对双向链表解释的文章都是用这个结构:   它们的连接情况是这样的:   相当的不直观,今天我要从详细的地址出发来解释双向链表的原理。   现定义一个结构体如下: struct student {char name; struct student *next; struct student *prior; };

PengPengBlog的博客 474

在单链表写入一组数据代码_数据结构与算法 | 单链表、双链表的增删改查(C++)...

本系列内容专为课程面向笔/面试的《数据结构与算法》总结性精讲开设,以图文并茂的方式讲解数据结构,让大家打牢基础,促进对课程内容的掌握,最后做到题解大神,大厂offer拿到手软!单链表、双链表的增删改查0. 数据结构图文解析系列1. 线性表简介2. 单链表2.1 单向链表的节点结构2.2 单向链表的抽象数据结构2.3 单链表添加节点2.4 单链表删除节点2.5 单链表代码测试3. 双向链表3.1 双...

weixin_39530833的博客 156

深入浅出:C++ 链表完全指南

链表(Linked List)是一种线性数据结构,它由一系列节点(Node)组成。与数组不同的是,链表中的元素在内存中不是连续存储的,而是通过指针连接在一起。操作时间复杂度说明访问O(n)需要从头遍历搜索O(n)需要遍历查找头部插入O(1)直接修改头指针尾部插入O(n)需要遍历到末尾头部删除O(1)直接修改头指针尾部删除O(n)需要找到倒数第二个节点中间插入/删除O(n)需要先找到位置画图!画图!画图!在纸上画出节点和指针的变化过程这是理解指针操作的最佳方法理解指针。

m0_59029415的博客 1063
上一篇: UDP远程
下一篇: HTA 调用bat脚本
IT故事
博客等级 码龄15年 4粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值