循环双链表及C语言实现

数据中心光模块升级实录:从200G QSFP56到400G QSFP-DD的踩坑指南 本文记录了数据中心从200G QSFP56升级至400G QSFP-DD光模块的完整实战经验。文章深入剖析了升级过程中面临的兼容性、链路预算、布线、散热与功耗管理等核心挑战,并提供了具体的解决方案与排坑指南,为高速网络升级提供了宝贵的实践参考。 阅读详情

本文介绍循环双链表及C语言实现

循环双链表

双链表中,每个结点单元都有一个数据域和两个指针域,每个结点的pre指针指向上一个结点(若为头结点则指向NULL),每个结点的next指针指向下一个结点(若为尾节点则指向NULL)。

循环双链表与双链表大体差不多,只是在头结点和尾节点有所区别:

  1. 头结点的pre指针指向尾结点
  2. 尾结点的next指针指向头结点

因此,循环双链表的任何结点都不包含NULL

循环双链表的示意图如下:
在这里插入图片描述
循环双链表的结构体与双链表一样:

struct node   
{  
    struct node *pre;   
    数据域;  
    struct node *next;   
}

循环双链表的操作

插入

头结点插入

  • 头结点为空
    链表为空,直接进行初始化:
  1. 将新结点作为头结点
  2. 新结点的pre指向头结点
  3. 新结点的next指向头结点

操作如下:

head=ptr;
ptr->pre=head;
ptr->next=head;
  • 头结点不为空
    循环双链表的尾结点是指向头结点的,因此,要想在头结点插入的话必须先遍历到尾结点:
  1. 使用temp=temp->next遍历到尾结点
  2. 使尾结点temp的next指向新结点ptr
  3. 使新结点的pre指向尾结点temp
  4. 使原头结点的pre指向新结点ptr
  5. 使新结点ptr的next指向原头结点
  6. 将新结点作为头结点

示意图如下:
在这里插入图片描述

操作如下:

temp->next=ptr;
ptr->pre=temp;
head->pre=ptr;
ptr->next=head;
head=ptr;

尾结点插入

  • 头结点为空的情况与在头结点插入为空的情况一致
  • 头结点不为空
    要在尾结点进行插入必须先遍历到尾结点,再进行插入操作:
  1. 使用temp=temp->next遍历到尾结点
  2. 使新结点ptr的pre指向原尾结点temp
  3. 使头结点的pre指向新结点ptr
  4. 原尾结点temp的next指向新结点ptr
  5. 新结点ptr的next指向头结点
    实际上是将新结点作为新的尾结点的操作

示意图如下:
在这里插入图片描述

操作如下:

ptr->pre=temp;
head->pre=ptr;
temp->next=ptr;
ptr->next=head;

指定位置插入

指定位置的插入与双链表相同,这里对双链表的部分进行重述

  1. 先通过temp=temp->next移动到指定位置,移动到该位置后结点后插入
  2. 使ptr的下一指针指向temp的下一结点
  3. 使新结点ptr的pre指向temp
  4. 使temp->next结点的pre指向新结点
  5. 使temp的next指针指向ptr

示意图如下:
在这里插入图片描述
操作如下:

通过“temp=temp->next”移动到指定位置;//对应1
ptr->next=temp->next;//对应2
ptr->pre=temp;//对应3
temp->next->pre=ptr;//对应4
temp->next=ptr;//对应5

删除

头结点删除

  • 只有一个结点
    直接将仅有的头结点释放即可:
head=NULL;
free(head);
  • 有多个结点
    循环双链表的尾结点是指向头结点的,因此要删除头结点必须先遍历到尾结点
  1. 使用temp=temp->next遍历到尾结点
  2. 将尾结点temp的next指向头结点的下一个结点
  3. 让头结点下一结点的pre指向尾结点temp
  4. 将头结点的下一结点作为新的头结点

示意图如下:
在这里插入图片描述

操作如下:

ptr=head;
temp->next=head->next;
head->next->pre=temp;
head=head->next;
free(ptr);

尾结点删除

  • 有一个结点时与只有一个结点在头部删除情况一致
  • 有多个结点
    循环双链表要删除尾结点应先遍历到尾节点
  1. 使用ptr=ptr->next遍历到尾结点
  2. 让尾结点ptr的前一结点的next指向头结点
  3. 让头结点的pre指向尾结点ptr的前一结点
  4. 释放尾结点ptr

示意图如下:
在这里插入图片描述

操作如下:

ptr->pre->next=head;
head->pre=ptr->pre;
free(ptr);

指定位置删除

指定位置的删除与双链表相同,这里对双链表的部分进行重述

  1. 先通过temp=temp->next移动到指定位置,移动到该位置时删除该位置后的结点
  2. 检查该位置是否为最后一个结点,如果是的话将该结点的next指针指向NULL
  3. 若指定位置不是最后一个结点,则让temp的next指针指向下一个ptr
  4. 让temp结点的next指向下一个ptr
  5. 使ptr结点的下一个结点的pre指向temp
  6. 释放ptr指针
    示意图如下:
    在这里插入图片描述

操作如下:

ptr->pre->next=ptr->next;
ptr->next->pre=ptr->pre;
free(ptr);

遍历

遍历时结点的next不为head就继续遍历

 while(ptr->next!=head){
	操作...
}

查找

将遍历到的数据与已有数据进行比对,有结点的数据相等则找到,否则数据不在链表里

while(ptr->next!=head){
 	结点的数据与现有数据比对...
}

循环双链表的C语言实现

本文提到的关于循环双链表的所有操作都使用C语言进行了实现,具体代码见Github

代码运行效果如下:
在这里插入图片描述
才疏学浅,难免有错误和不当之处,欢迎交流批评指正!
同时有问题的话欢迎留言或邮箱联系(ljt_IT@163.com)。

创作不易,觉得写得不错就微信扫码奖励一下吧!

Reward

YOLO26改进 - 注意力机制 | MLLAttention (Mamba-Like Linear Attention) 类Mamba线性注意力:动态感受野适配多尺度目标 本文介绍了Mamba-Like Linear Attention (MLLA)模型及其在yolo26中的集成。MLLA结合了Mamba和线性注意力Transformer的优点,线性注意力降低计算复杂度,Mamba有效建模序列。该模型将Mamba的遗忘门和块设计等关键元素与线性注意力结合,还可用位置编码替代遗忘门。我们将MLLA引入yolo26,在检测头的不同尺度特征图上应用。实验表明,改进后的yolo26在目标检测任务中表现良好,体现了MLLA在提升模型性能上的有效性。 阅读详情

相关推荐

格(Lattice)基础(一)

有关格的基础概念,和相关的格难题

Amire0x的小乐园 5692

循环双链表详解(C语言版)

之前学习的双链表结构,可以实现从表中任一结点出发找到链表中的其他结点,但是该结构如果要从头结点开始查找尾结点,那么就需要通过遍历查找尾结点,这种情况下双链表的效率较低,为了解决这个缺点,将其改进为循环双链表,以此来提高查找效率。

qq_44075108的博客 1万+

数据获取竟如此简单——全球SRTM 90m DEM V4.1数据

SRTM(Shuttle Radar Topography Mission)是由NASA联合国际合作伙伴开展的雷达地形测绘项目,通过航天飞机搭载的合成孔径雷达系统,于2000年通过发射并接收地表反射的雷达信号,获取全球三维地形数据,这一任务填补了高精度全球地形数据的空白。而本文通过十余行的python代码,就更简单、方便地获取这些数据。

m0_38065162的博客 1388

数据结构——“双向循环链表“ 易懂刨析双向循环链表(图解+代码)

循环链表单向循环链表双向循环链表1. 双向循环链表——插入2. 双向循环链表——删除 单向循环链表 关于两个循环链表合并为一个循环链表 双向循环链表 在单链表L中,查找ai的后继Next(L,a;),耗时仅为O(1),因为取ai后继指针即可。 但查找a;的直接前驱Prior(L,ai);则需从链表的头指针开始,找到结点ai前一结点即是。故运算Prior(L,ai)依赖表长n,耗时为O(n)。另外,若链表中有一指针值被破坏,则整个链表脱节。这是单链表的不足 为此,引入双向链表。先定义双向链表中的结点:

weixin_44278698的博客 2万+

强化学习-----DQN(Deep Q-network)

DQN(Deep Q-Network)是一种基于深度学习和强化学习的算法,由DeepMind提出,用于解决离散动作空间下的马尔科夫决策过程(MDP)问题。它是首个成功将深度学习应用于解决强化学习任务的算法之一。DQN,即深度Q网络(Deep Q-network),是指基于深度学习的Q-Learing算法。那什么是Q-leaning?可以看上一篇文章Q-learning是一种经典的强化学习算法,用于解决马尔可夫决策过程(Markov Decision Process,MDP)中的控制问题。

qq_74722169的博客 2万+

高通Camera AWB跳变问题实战:从夕阳场景到参数调优的完整避坑指南

本文深入解析高通Camera AWB跳变问题,特别是在夕阳场景下的色温突变现象。通过分析灰区统计失效、光源混合干扰等成因,提供从参数调优到诊断工具链的完整解决方案,包括动态灰区扩展算法、色温平滑过渡方案及高通平台特定优化技巧,帮助工程师有效解决AWB跳变问题。

sre5engineer的博客 849

详解:循环双链表

本文关于数据结构中的循环双链表相关特点以及操作还有代码完整实现

菜鸟学习总结 1721

损失函数大汇总(五十九)(TopoInteraction Loss附公式推导与代码)

本文介绍了TopoInteraction Loss,一种用于多类别分割任务的拓扑交互约束损失函数。不同于传统拓扑损失关注单类别的连通性和孔洞数量,该损失重点约束不同类别之间的空间关系,包括互斥(exclusion)和包含(containment)两种典型拓扑关系。通过将全局拓扑约束转化为局部邻接检测,该损失能准确定位破坏预设拓扑关系的像素,并针对性施加惩罚。关键创新点在于:1)将包含关系转化为互斥约束;2)使用卷积运算高效检测非法邻接;3)仅对违规像素施加损失。实验表明,该方法能有效纠正类别间的错误接触,特

悦学共鸣,温柔以待,汇聚光芒,共同成长 343

数据结构——双向循环链表

双链表的结构 解析: 每一个结点都有一个数据域,两个指针域。其中一个指针域指向它的直接后继,另外一个指向它的直接前驱。 对于头结点来说,它的直接前驱是最后一个结点;对于最后一个结点来说,它的直接后继是头结点。所以对于双向链表来说,它的判空条件是head->next=head或者是head->prev=head 下图为一个带头结点的空双链表 双链表基本操作的实现 (1)插入 1....

weixin_43850474的博客 2716

SAP RAP 里的 EML 全解:从语言定位到事务语义,再到真实案例的落地方式

摘要:EML(Entity Manipulation Language)是ABAP RAP模型的核心组件,作为ABAP的子集用于操作业务对象(BO)。它通过声明式语法(READ/MODIFY/EXECUTE/COMMIT)统一访问BO的行为与数据,并由RAP运行时自动处理校验、锁定、草稿管理等生命周期。EML将业务语义融入代码,确保与Fiori应用共享同一套校验逻辑,并通过FAILED/REPORTED/MAPPED管道传递错误与消息。其事务控制(IN LOCAL MODE与COMMIT ENTITIES)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 518

AIGC实战——基于Transformer实现音乐生成

Transformer 是最流行的音乐生成技术之一,因为音乐可以视为一个序列预测问题,Transformer 模型将音符视为一个个符号的序列(类似于句子中的单词),从而用于生成音乐。Transformer 模型基于先前音符预测下一个音符,生成音乐作品。在本节中,将学习如何处理音乐数据,并应用 Transformer 生成与给定训练集风格相似的音乐。

盼小辉丶的博客 1万+

循环链表详解(C语言)

本文主要讲述循环链表的基本定义特点以及一些常见操作并使用C语言代码对其进行实现。如何使用C语言代码去创建循环链表、插入头为节点、删除元素、输出链表长句、打印链表等基本运算。本文仅仅主要介绍了循环链表的概念、特点、运算以及循环链表的优缺点比较。特别注意当我们在实现循环连表时, 循环单链表没有明显的结束条件,很容易陷入死循环。此时,我们可以设置一个标记点作为循环的标记,当我们知道表长,我们也可以设置一个计数器来结束循环。

m0_55698213的博客 3414

DA14531-外设驱动篇-UART收发通信应用

宏定义注解CFG_PRINTF用户开启串口串口打印宏设置波特率选择115200。

hejinwu1314的博客 728

循环双链表的简单实现(C语言)

循环双链表的C语言版简单实现,及简单讲解

文溪山人的博客 2581

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言 不带头结点的循环双链表的实现和相关操作。

C语言 不带头结点的循环双链表的实现和相关操作。 #include<stdio.h> #include<stdlib.h> typedef int DAT; typedef struct node { struct node *prior;//指向前一节点 DAT data;//储存数据 struct node *next;//指向下一节点 }Node; void init_list(Node **pL)//初始化链表 { (*pL)=NULL; } Node* ma

ok_阿伟的博客 1425

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言实现循环双链表

C语言实现循环双链表

嵌入式软硬件叶玄 275

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C语言 带有头结点的循环双链表的实现和相关操作。

C语言 带有头结点的循环双链表的实现和相关操作。 #include<stdio.h> #include<stdlib.h> typedef int DAT; typedef struct node { struct node *prior;//指向前一节点 DAT data;//存储数据 struct node *next;//指向下一节点 }Node; typedef struct { Node *head;//指向头节点 int size;//存储节点个数

ok_阿伟的博客 1364

c语言实现循环双链表

【代码】c语言实现循环双链表。

Ao_Tian的博客 146

循环双链表的实现(C语言)

循环双链表

m0_59519985的博客 141

循环双链表:从原理到C语言实现详解

循环双链表的特性与优势。

xienda的博客 495

考研数据结构——C语言实现循环双链表

C语言实现循环双链表

weixin_58879477的博客 556

C语言实现的,包含循环双链表的基本操作:创建、显示、后插插入、删除、查询和遍历功能。

用VS2O22 c语言实现的一个简单的循环双链表,提供了用户交互菜单、插入、删除、遍历、查询等功能

2401_84643729的博客 880

[C语言实现]带你手撕带头循环双链表

新手简单易懂,小白上手容易,代码详细的带头循环双链表。

FlashRider的干货分享小窝 1127

循环双链表(C语言实现)

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef int DataType; typedef struct Node { DataType data; // 数据域 struct Node * prior; // 前趋指针 struct Node * next; // 后继指针 }Li...

Mr_John 442

数据结构:线性表(循环双链表)C语言简单实现

数据结构:线性表(循环双链表)C语言简单实现 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define _CRT_SECURE_NO_WARNINGS #define ok 1 #define error -1 typedef int Elemtype; typedef int Status; //带头结点的 typedef struct DNode { Elemtype data;

qq_45811908的博客 998

C语言实现非循环双链表节点的删除(带头结点尾结点)

我在之前一篇博客《C语言实现非循环双链表节点的删除(不带头结点)》中详细讲解了不含头尾节点的双链表中删除一个节点,处理过程还是稍显麻烦。自从我们学习使用头尾节点来处理双链表后,删除过程就非常方便。代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleLinkedList_HeadList 。核心代码如下://删除pos位置的节点 int D

乞力马扎罗的雪CYF的博客 3989
上一篇: 循环单链表及C语言实现
下一篇: 堆栈的数组实现(C语言)
Jeaten
博客等级 码龄10年 299粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值