【线性表】链表:循环单链表、双链表、循环双链表的基本特性

C++ 线性表 实验及代码 1.实验内容: (1)了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中 表示这种关系有顺序存储结构和链式存储结构; (2)掌握这两种存储结构的描述方法; (3)掌握线性表的基本操作(查找、插入、删除); (4)考虑时间和空间复杂度来设计算法。 2.实验内容: (1)创建一个顺序表,存放在数组 A[N]中,元素的类型为整型,设计算法调整 A,使其左边的所有元素小于 0,右边的所有元素大于 0(要求算法的时间复杂度和空 间复杂度均为 O(n))。 (2)建立一个循环单链表,其节点有 prior, 阅读详情

链表不仅作为链式存储的一种实现方式,还表达了计算机不连续(离散)的存储思想。在初学阶段,链表的实现类型有单链表(带/不带头结点)、循环单链表、双链表、循环双链表四种。

上文已经讲解了单链表,接下来将讲解其他三类。


Table of Contents

循环单链表

双链表

循环双链表


循环单链表

 

定义:

将单链表中终端结点的指针端由 NULL 改为 指向头结点 ,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。

 

 

两种情形:

  • 为使空链表与非空链表处理一致,通常设置一个头结点。但并非必须设置头结点。

循环单链表特征:

  1. 对于单链表而言,最后一个结点指向NULL;把最后一个结点的不指向NULL而指向头,就是循环单链表;
  2. 在单循环链表上的操作基本上与非循环链表相同。循环链表和单链表的主要差异就在于循环的条件判断上,原来是 p->next == NULL,现在是 p->next != 头结点 ,则循环未结束。
  3. 单循环链表可以从表中任意结点开始遍历整个链表,不仅如此,有时对链表常做的操作是在表尾、表头进行。如果用头指针表示循环链表,则需O(n) 时间找到最后一个结点。若改用尾指针表示循环链表,此时查找开始结点和终端结点都很方便了。查找终端结点时间是O(1),而开始结点,其实就是 rear->next->next ,其时间复杂也为O(1)。

第一个循环单链表


#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef struct node
{
	int data;
	struct node* next;
}Node; //struct node 完全等于 Node(结构体变量)
typedef Node* LinkList; //struct node * 完全等于 LinkList(结构体指针)

int main()
{
	LinkList head = (LinkList)malloc(sizeof(Node));
	assert(head != NULL);  //检查malloc之后是不是空间不够,返回了空指针NULL(WarningC6011:取消对NULL指针的引用)
	LinkList NodeAa = (LinkList)malloc(sizeof(Node));
	assert(NodeAa != NULL);
	LinkList NodeBb = (LinkList)malloc(sizeof(Node));
	assert(NodeBb != NULL);
	LinkList NodeCc = (LinkList)malloc(sizeof(Node));
	assert(NodeCc != NULL);

	head->data = NULL; //头结点,不保存数据
	head->next = NodeAa;
	NodeAa->data = 202;
	NodeAa->next = NodeBb;
	NodeBb->data = 303;
	NodeBb->next = NodeCc;
	NodeCc->data = 404;
	NodeCc->next = head;  //单链表中:NodeCc->next = NULL;

	LinkList p = head->next; //把链表头结点的下一个节点,交给指针p,去遍历
	while (p != head)
	{
		printf("%d  ", p->data);
		p = p->next;
	}

	return 0;
}

 

 


双链表

 

定义:

双向链表也叫双链表,它的每个数据结点中都有两个指针(保存两个节点的地址),分别指向直接后继和直接前驱。

 

 

双链表的代码定义:

 

typedef struct node
{
	int data;
	struct node* pre; //前驱
	struct node* next; //后继
}Node;

 

特性:

  1. 从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
  2. 循环链表的最后一个结点指向头结点,循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。
  3. 双向链表使单链表中扩展出来的结构,因此有一部分操作与单链表是相同的,如求长度函数、查找元素位置、打印函数、销毁函数等,这些函数操作都只要涉及一个方向的指针即可。

第一个双链表

第一个双链表
#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef struct node
{
	int data;
	struct node* pre;
	struct node* next;
}Node; //struct node 完全等于 Node(结构体变量)
typedef Node* LinkList; //struct node * 完全等于 LinkList(结构体指针)

int main()
{
	LinkList head = (LinkList)malloc(sizeof(Node));
	assert(head != NULL);  //检查malloc之后是不是空间不够,返回了空指针NULL(WarningC6011:取消对NULL指针的引用)
	LinkList NodeAa = (LinkList)malloc(sizeof(Node));
	assert(NodeAa != NULL);
	LinkList NodeBb = (LinkList)malloc(sizeof(Node));
	assert(NodeBb != NULL);
	LinkList NodeCc = (LinkList)malloc(sizeof(Node));
	assert(NodeCc != NULL);

	head->data = 101;
	head->pre = NULL;
	head->next = NodeAa;

	NodeAa->data = 202;
	NodeAa->pre = head;
	NodeAa->next = NodeBb;

	NodeBb->data = 303;
	NodeBb->pre = NodeAa;
	NodeBb->next = NodeCc;

	NodeCc->data = 404;
	NodeCc->pre = NodeBb;
	NodeCc->next = NULL;  //单链表中:NodeCc->next = NULL;

	LinkList p = head; //把链表头结点的下一个交给指针p,去遍历
	printf("顺序遍历:");
	while (p != NULL)
	{
		printf("%d  ", p->data);
		p = p->next;
	}

	printf("\n逆序遍历:");
	LinkList tail = NodeCc;
	p = tail;
	while (p != NULL)
	{
		printf("%d  ", p->data);
		p = p->pre;
	}

	return 0;
}

 

 


循环双链表

 

定义:

双向链表也叫双链表,它的每个数据结点中都有两个指针(保存两个节点的地址),分别指向直接后继和直接前驱。头指针的前驱指向最后一个节点,最后一个节点的后继指向头指针。

双链表的代码定义:

typedef struct node
{
	int data;
	struct node* pre; //前驱
	struct node* next; //后继
}Node;

特性:

  1. 从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
  2. 循环链表的最后一个结点指向头结点,循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。
  3. 双向链表使单链表中扩展出来的结构,因此有一部分操作与单链表是相同的,如求长度函数、查找元素位置、打印函数、销毁函数等,这些函数操作都只要涉及一个方向的指针即可。

两种情形:

第一个循环双链表

#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef struct node
{
	int data;
	struct node* pre;
	struct node* next;
}Node; //struct node 完全等于 Node(结构体变量)
typedef Node* LinkList; //struct node * 完全等于 LinkList(结构体指针)

int main()
{
	LinkList head = (LinkList)malloc(sizeof(Node));
	assert(head != NULL);  //检查malloc之后是不是空间不够,返回了空指针NULL(WarningC6011:取消对NULL指针的引用)
	LinkList NodeAa = (LinkList)malloc(sizeof(Node));
	assert(NodeAa != NULL);
	LinkList NodeBb = (LinkList)malloc(sizeof(Node));
	assert(NodeBb != NULL);
	LinkList NodeCc = (LinkList)malloc(sizeof(Node));
	assert(NodeCc != NULL);

	head->data = NULL; //头结点,不保存数据
	head->pre = NodeCc;
	head->next = NodeAa;

	NodeAa->data = 202;
	NodeAa->pre = head;
	NodeAa->next = NodeBb;

	NodeBb->data = 303;
	NodeBb->pre = NodeAa;
	NodeBb->next = NodeCc;

	NodeCc->data = 404;
	NodeCc->pre = NodeBb;
	NodeCc->next = head;  //单链表中:NodeCc->next = NULL;

	LinkList p = head->next; //把链表头结点的下一个交给指针p,去遍历
	printf("顺序遍历:");
	while (p != head)
	{
		printf("%d  ", p->data);
		p = p->next;
	}

	printf("\n逆序遍历:");
	p = p->pre;
	while (p != head)
	{
		printf("%d  ", p->data);
		p = p->pre;
	}

	return 0;
}


 

数据结构----带头循环双链表(带哨兵位)(C语言) 双链表作为数据结构中的非线性表结构,对比于单链表具有它的优势:可以直接找到当前结点的上下结点。但由于双链表的这个特性,如果不带哨兵位,一不小心就可能手撕一个错的双链表出来。所以今天我们写一个带哨兵位的循环双链表。非循环双链表的话,实现起来和循环双链表差别不大,只是头尾并没有相连,而是指向NULL。今天,我将手撕一个双链表,包括双链表的初始化,插入删除,查找等一系列操作,准备好了吗!!!先来一个抽象图,理解理解。来了! 阅读详情

相关推荐

【科研导航】【计算机视觉与图像处理】从顶刊到潜力股:跨学科(电子/电气/信息)SCI期刊投稿全景图

本文全面解析了计算机视觉与图像处理领域的SCI期刊投稿策略,涵盖从顶刊到潜力股的各类期刊特点。重点介绍了IEEE Transactions系列、Elsevier旗舰期刊以及二区优质期刊的审稿偏好和投稿技巧,特别适合电子/电气/信息交叉学科的研究者。文章还提供了三区、四区期刊的实用投稿建议,帮助科研新手快速找到适合的发表平台。

weixin_30897233的博客 81

双向链表

双向链表相较于单向链表操作性能更好。在进行数据操作的过程中速度更快。 public class LinkedList<E> extends AbstractList<E> { private Node<E> first; private Node<E> last; private static class Node<E> {...

修竹的博客 273

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

循环双链表与双循环链表差别_实施循环双链表| C程序

循环双链表与双循环链表差别Solution: 解: Input: The data of each node 输入:每个节点的数据 Output: The circular doubly linked list 输出:圆形双向链表 Data structure used: A circular doubly linked list where each node contains a ...

cumtb2009的博客 901

STM32实战:滑模观测器与PLL锁相环融合的FOC无感控制精解

本文深入解析了STM32平台下结合滑模观测器(SMO)与PLL锁相环的无感FOC控制技术。通过实战案例详细介绍了PLL锁相环在消除SMO高频抖振、提升角度跟踪精度方面的关键作用,并分享了工程调参技巧、C语言实现细节及系统联调方法,为电机控制开发者提供了一套完整的解决方案。

weixin_30838873的博客 189

某瓜数据app 获取达人直播商品信息接口 Sign

某瓜数据app 获取达人直播商品列表接口 Sign

自成背后的博客 6039

链表——循环单链表,循环双链表及静态链表

文章目录循环链表循环单链表循环双链表静态链表说明 循环链表  循环链表一般包括循环单链表和循环双链表,如下图所示: 循环单链表   循环单链表与单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而使整个链表形成一个环。   一般对循环单链表只设尾指针不设头指针,其原因是,如果设的是头指针,对表尾进行操作需要O(n)的时间复杂度,而若设的是尾指针r,那么r->next即为头指针,对表头与表尾进行操作都只需要O(1)的时间复杂度。  单链表与循环单链表:  详细的单链表操作请参

薛定谔的猫的博客 3881

【KingSCADA】如何建立硬件系统及相关变量

本篇主要讲解如何定义设备,如何定义变量。KingSCADA3.8的采集系统是指负责和现场设备进行通讯,并采集现场数据和控制现场数据的模块,称之为采集器,也叫IOServer应用,它是一组独立的应用程序,可以脱离KingSCADA3.8软件,它依赖于KingSCADA3.8驱动产品,通过驱动与IO设备进行通讯。采集系统由通讯链路,设备,数据块组成。链路:链路是指计算机通过什么方式(接口)与设备进行连接,链路类别:串口,以太网,GPRS,Modem,通信卡,采集卡,无链路。

做有价值的事,积累有价值的笔记! 1万+

双向链表和双向循环链表

双向链表和双向循环链表和单向链表相比,多了一个前驱结点。如果他为空,那么next和prior都指向自己。而对于双循环链表,只需要最后一个元素的next指向head->next,head->next的prior指向最后一个节点即可。插入操作 新节点s插入链表,s->next给p结点,s->prior给p->prior,然后,p->prior->next指向s,p->prior再指向s。顺序需要注意

GodBMW的博客 1229

小孙学变频学习笔记(二)变频器的逆变电路

本文主要介绍了变频器中逆变电路的核心器件IGBT及其应用。IGBT是一种电压控制型三端半导体开关器件,具有开关频率高、功耗低的优点,在变频器中仅使用截止和饱和导通状态。文章详细分析了IGBT的结构特性、与晶闸管的区别,以及由四个IGBT组成的直流转交流逆变电路原理。重点阐述了IGBT并联反向二极管的作用:提供电流反向通路、避免反向电压损坏器件、提高开关效率等。最后提供了相关学习参考网址供读者进一步研究。

qq_43091070的博客 1195

10. 重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器!

重磅!Spring AI 1.0 正式发布,Java 开发者的 AI神器! 全网最详细的Spring AI 文章,每章都会提供代码入口,让你更容易得入门和理解Spring AI 相关概念,直接节约你百分之六十的学习成本时间。

gorgor在码农 1065

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

1.循环单链表 1.循环单链表特点: 链表中最后一个结点的指针域不再是结束标志,而是指向整个链表的第一个结点,从而使链表形成一个环。和单链表相同,循环单链表也有带头结点和不带头结点两种。带头结点的循环单链表实现插入和删除操作较为方便,且更加适用。 2. 单链表与循环单链表比较: 循环单链表可以从尾到头,而单链表不能从尾到头。因此处理的数据序列具有环形结构特点时,适合采用循环单链表。 3.

xiaofei的博客 7414

医疗影像配准与融合: 使用MATLAB对医学影像进行配准和融合,实现不同影像模态之间的对准和结构信息融合等

医疗影像配准与融合是医学影像处理的重要技术,它用于将不同来源、不同时间或不同模态的医学影像进行配准和融合,以获得更加完整、准确的患者解剖信息。基于MATLAB的医疗影像配准与融合可以帮助医生更准确地诊断疾病,制定更有效的治疗方案。医疗影像配准与融合是医学影像处理的关键技术,它对于提高医学影像诊断和治疗的准确性至关重要。MATLAB是一种功能强大的数学和科学计算软件,它可以为医疗影像配准与融合提供强大的工具和支持。

走向CTO的路上... 712

线性表 考研数据结构笔记

线性表 一.线性表的基本概念 1.线性表的定义 线性表是具有相同特性数据元素的有限序列。该序列中所含元素的个数叫线性表的长度,用n(n>=0)表示。注意,n可以等于零,表示一个空表。 线性表有序序列,数据元素具有相同的特性,线性表可以有无性。 2.线性表的逻辑特性 其他元素只有一个直接前驱,也直接后继。 3.线性表的存储结构 线性表存储结构有顺序结构和链式存储结构。前者是顺序表,后者为链表。 (1)顺序表 顺序表把线性表的所有元素按照其逻辑顺序,依次存储到从指定的存储位置开始的一块连续的存储结构空间中

qq_41069833的博客 2670

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据结构-线性表

一、线性表基本概念 1、定义:线性表是具有相同特性数据元素的一个有限序列 相同特性:同一类实物归类、方便批量处理 有限:元素个数为n,n有限大,n可以为0 序列:表中元素排成一排,一对一的逻辑特性 2、逻辑结构 只有一个表头元素,只有一个表尾元素,表头元素无前驱,表尾元素无后继,除表头元素和表尾元素,其他元素只有一个直接前驱和一个直接后继。 3、存储结构(顺序/链式存储结构) 顺序表:线性表中所有元素按逻辑排序,存到连续的存储空间中 链表:每个结点有所存元素的信息(元素之间逻辑关系的信息)

wmx的博客 314

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

线性表

线性表

每天向上爬的小蜗牛的博客 223

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Python】数据结构——线性表(顺序表、单链表、循环单链表、双链表、循环双链表)

线性表是由若干个具有相同特性的数据元素组成的有限序列 空表就是线性表中不包含任何元素,长度为零。当线性表非空时,线性表长度即线性表内数据元素的个数。 直接前驱:线性表某一个元素的前一个元素 直接后继:线性表某一个元素的后一个元素

二琳爱吃肉的博客 3666

java实现双向循环链表(循环双链表)

若是不清楚链表的结构,该篇文章不适合观看,这里只做文字说明,没有链表结构的图示

初心不忘、始终方得 6323

【数据结构】二、线性表:4.循环链表的定义及其基本操作(循环单链表,循环双链表的初始化、判空、判断头结点、尾结点、插入、删除)

循环双链表(Circular Doubly Linked List)是一种特殊类型的双向链表,其中最后一个节点的下一个指针指向头节点,头节点的前一个指针指向最后一个节点,形成一个循环。循环单链表与普通单链表的主要区别在于,循环单链表的尾节点的指针不是指向 nullptr,而是指向头节点,形成一个闭环。这意味着,在循环单链表中,可以通过尾节点的指针重新回到头节点。循环单链表(Circular Singly Linked List)是一种特殊类型的单链表,其中最后一个节点的指针指向头节点,形成一个循环。

关注:https://github.com/Suhan42 1594

数据结构要点总结——04 双链表、循环单链表、循环双链表、静态链表、比较顺序表和链表

上一小节中通过对线性表的链式存储的学习,我们认识到了,或者叫做。接下来就让我们来学习一下除了单链表之外的其他链表,包括双链表、循环链表、静态链表。最后我还会详细的总结一下顺序表和链表的区别。

m0_56286960的博客 2265

【数据结构】链式家族的成员——循环链表与静态链表

【数据结构】第二章——线性表(8) 详细介绍了循环链表与静态链表的相关内容……

蒙奇D索大的博客 1683

顺序表、单链表、循环单链表、循环双链表、有序单链表的排序的实现

一、单链表、循环单链表、循环双链表各自特点 链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每个节点里存到下一个节点的指针。由于不须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比顺序表O(logn)快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表的时间复杂度是O(1)。链表结构可以充分利用计算机内存空间...

weixin_34186950的博客 1656

数据结构2-以前搞不懂线性表:静态顺序表、动态顺序表、静态链表、单链表、双链表等,现在全懂了,吐血总结一波。(代码是c语言描述)

文章目录1. 线性表的定义和基本操作1.1 线性表的定义1.2 线性表的基本操作1.3 线性表的分类2. 线性表的线性实现-顺序表2.1 数组静态分配的顺序表(C语言实现)2.1.1 目录结构2.1.2 SeqList.h2.1.3 SeqList.cpp2.1.4 main.cpp2.1.5 程序运行结果2.1.6 几个注意点2.2 数组动态分配的顺序表(C语言实现)2.2.1 几个注意点2.2...

渐渐的忘记,赶不上明天(读研ing,2024年毕业) 3439

数据结构-一文吃透线性表中链表题目

1.链表不具有的特点是 ( A) A. 可随机访问任一元素 B. 插入删除不需要移动元素 C.不必事先估计存储空间 D.所需空间与线性表长度成正比 答案解析 [解析] 链表采用的是链式存储结构,它克服了顺序存储结构的缺点:它的接点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。但是链式存储结构也有不足之处:①每个结点中的指针域需额外占有存储空间;②链式存储结构是一种非随机存储结构。 2.设单链表中指针p指向A,若要删除A的后继结点,则需修改指针的操作为(p

呵呵哒!的博客 6242

数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表

万字长文,整理线性表相关知识,建议收藏。 顺序表、单链表、双链表、循环链表...

丹丹的后花园 2537

链表插入删除操作(单链表,双链表+循环链表)

在p后插入s在p后插入s在p后插入s s->next = p->next; p->next=s; 删除s删除s删除s p->next = s->next; free(s); 在p后插入s在p后插入s在p后插入s s->next = p->next; s->prior = p; p->next =s; s->next->prior =s; 删除s删除s删除s s->prior->next = s->next; s-&.

ResumeProject的博客 2572
上一篇: 【线性表】单链表的基本特性
下一篇: 【线性表】队列:顺序队列、顺序循环队列、链式队列的基本特性
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值