顺序表和链表的对比(一)

顺序表和链表 顺序表和链表的简单介绍和实现 阅读详情

前言

今天给小伙伴们分享的是在数据结构中顺序表和链表的对比。它们在计算机科学和软件开发中具有广泛的应用,是理解更复杂数据结构(如栈、队列、树、图等)的基础。这次将会给大家从定义初始化,以及功能增删查改上进行详细对比,以便于大家掌握并使用。那让咱们开始吧@

一.基本知识概述

考虑到可能有些小伙伴还没了解到顺序表或链表,就先概述一下关于它们的基本知识。

1.顺序表

顺序表(Sequential List) 是用一段物理地址连续的存储单元依次存储数据元素的线性结构。一般是使用数组方式实现 ,它的元素在内存中是连续存储的。顺序表是数据结构中最基础的一种线性表,具有高效的随机访问特性,但在插入和删除操作上效率较低。

2.链表

链表(Linked List)  是一种在物理存储结构上非连续、非顺序的存储结构,又因为在节点结构和操作上不同分有(双链表还细分是否循环与是否带哨兵位头节点):双链表(Doubly Linked List)和单链表(Singly Linked List)。链表与顺序表不同,它是靠指针链接实现的,顺序表的元素在内存中是连续存储的,而链表的元素可以分散在内存的任何位置。因此它在插入和删除上效率比顺序表更高些。

二.定义及初始化

1.顺序表

顺序表通常由以下部分组成:

  1. 数据存储区:

    一个数组(需要考虑数据大小,是否需要自主开辟空间和扩容),用于存储元素。
  2. 长度信息:

    一个变量,用于记录当前顺序表中元素的数量
静态顺序表

(静态的意思是存储空间有限)首先定义一个结构体,然后在结构体里再定义一个数组以及一个整型变量来显示顺序表长度,不知道数据具体大小的时候,使用起来比较麻烦,容易产生数组越界以及空间浪费问题,这里推荐使用动态的顺序表。

#define MAX_SIZE 100 // 定义一个能容纳所有数据的容量,这个属于静态顺序表了,不易把控使用空间

//一般推荐大家使用动态顺序表



typedef struct SequentialList
{
    int data[MAX_SIZE]; // 数据存储区
    int length;         // 当前顺序表的长度
} SL;

静态顺序表的初始化比较简单,只需初始化长度即可

void InitList(SL* ps) 
{
    L->length = 0; // 初始化长度为 0
}
动态顺序表

动态顺序表则在空间使用上更加灵活,使用数组指针,通过 malloc 函数开辟所需空间,如果不够再使用realloc 函数进行扩容,但是需考虑内存泄漏问题,以及后续使用完空间的释放问题。

typedef int SLDataType; //定义数组类型,方便存储各种类型不同的数据

#define INIT_CAPACITY 4 //定义一个空间容量,方便后续扩容

// 动态顺序表 -- 按需申请
typedef struct SequentialList
{
	SLDataType* a;
	int size;     // 有效数据个数
	int capacity; // 空间容量
}SL;

对比于静态顺序表,动态顺序表初始化则较为复杂一点

(扩容函数的使用放在数据插入,不够再扩,节省空间)

void SLInit(SL* ps)
{
	assert(ps);

	ps->a = (SLDataType*)malloc(sizeof(SLDataType)* INIT_CAPACITY); 通过malloc 函数开辟空间
	
    if (ps->a == NULL)//若开辟失败,返回错误信息

	{
		perror("malloc fail"); 	
	    return;
	}

	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}

2.链表

链表的话则是通过结构体指针来实现,单链表和双链表的定义差不多,主要区别在节点指针的数量及指向方向。双链表较于单链表,支持双向遍历,增删数据更加灵活,但在空间效率上略低于单链表,因为它有两个节点指针,并且在维护时需要调整两个指针,容易出错。

1. 单链表(Singly Linked List)

  • 节点结构:

    • 每个节点包含两个部分:

      1. 数据域:存储数据。

      2. 指针域:指向下一个节点的指针。

  • 链表结构:

    • 链表由一系列节点组成,每个节点通过指针连接。

    • 链表的最后一个节点的指针域为 NULL,表示链表的结束。

typedef int SLTDataType;  定义数据类型,方便后续适用于存储各种类型数据

typedef struct SListNode
{
	SLTDataType data; 
	struct SListNode* next; 指向下一个节点
}SLTNode;

单链表的初始化通过节点创造函数创建了一个节点并赋初值,然后把节点指针传递回插入函数(下期会详细介绍)

SLTNode* CreatSLTNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); //创建节点
	if (newnode == NULL)
	{
		perror("malloc fail"); //若开辟失败,则返回错误信息
		return NULL;
	}

	newnode->data = x;
	newnode->next = NULL; //避免出现野指针

	return newnode; //返回节点指针到插入函数
}

2. 双链表(Doubly Linked List)

  • 节点结构:

    • 每个节点包含三个部分:

      1. 数据域:存储数据。

      2. 前驱指针:指向前一个节点的指针。

      3. 后继指针:指向下一个节点的指针。

  • 链表结构:

    • 链表由一系列节点组成,每个节点通过前驱指针和后继指针连接。

    • 链表的第一个节点的前驱指针为 NULL,最后一个节点的后继指针为 NULL。

双链表的定义则比单链表多一个指针,于是便有了访问上一个节点的功能

typedef int LTDataType; 定义数据类型,方便后续适用于存储各种类型数据

typedef struct ListNode
{
	struct ListNode* next; 指向下一个节点指针
	struct ListNode* prev; 指向上一个节点指针

	LTDataType data;
}SL;

双链表的初始化跟单链表差不多,多了一个回访指针的初始化。


SL* CreatSListNode(LTDataType x)
{
	SL* node = (LTNode*)malloc(sizeof(LTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		//return NULL;
		exit(-1);//调用 exit 函数以非零状态终止程序。
	}
	node->next = NULL;
	node->prev = NULL;//回访指针,指向上一个节点
	node->data = x;

	return node;
}

在这里呢,再提一下带哨兵位(sentinel node)头节点的双链表。先解释一下什么是哨兵位节点(sentinel node)吧。

哨兵节点(sentinel node)是一种特殊的结点,它可以简化链表中的操作,减少边界条件的判断和特殊处理,假如用它作头节点,在进行链表增删操作时就不用单独考虑链表是否为空的情况了。

具体实现也很简单,大家可以理解成跟不带哨兵位节点时一样,只不过之前是在头节点中开始放数据,现在是在第二个节点中开始放数据,相当于头节点里面数据是空的,头节点是空指针。

// 创建新节点的函数


SL*CreatSListNode(LTDataType x)
{
	SL* node = (LTNode*)malloc(sizeof(LTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		//return NULL;
		exit(-1);//调用 exit 函数以非零状态终止程序。
	}
	node->next = NULL;
	node->prev = NULL;//回访指针,指向上一个节点
	node->data = x;

	return node;
}

// 初始化双链表的函数
    
void InitList(SL* L) 
{
    // 创建哨兵节点
    L->sentinel = (Node*)malloc(sizeof(Node));
    L->sentinel->prev = L->sentinel; // 哨兵节点的 prev 指向自己
    L->sentinel->next = L->sentinel; // 哨兵节点的 next 指向自己
}

void InsertAtHead(SL* L, int x )
{
   SL* newNode = CreatSListNode(x);

    // 将新节点插入到哨兵节点之后
    newNode->next = L->sentinel->next;
    newNode->prev = L->sentinel;
    L->sentinel->next->prev = newNode;
    L->sentinel->next = newNode;
}










以上就是这期的内容,希望能给有需求的小伙伴们提供一些帮助,如果有疏漏的地方,小伙伴们可以直接指出,以便纠正,祝大家天天开心@

【回眸】Tessy集成测试软件使用指南(一)新手使用篇 这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。 阅读详情

相关推荐

【已解决】Claude应用地区限制问题:通过Slack注册与魔法节点切换实战指南

本文详细介绍了如何通过Slack注册和切换魔法节点解决Claude应用地区限制问题。从Slack账号注册、创建工作区技巧,到突破地区限制的关键步骤和成功后的配置使用,提供了全面的实战指南。特别强调了节点选择和网络环境对解决'App unavailable'错误的重要性,帮助用户顺利使用Claude AI助手。

weixin_29209801的博客 1776

顺序表和链表的比较

综上所述,顺序表适用于数据元素较少、读取操作频繁的场景,而链表适用于数据元素较多、插入、删除操作频繁的场景。

icbbm的博客 4126

科大讯飞(1): 环形6麦语音唤醒—驱动板上的接口

介绍环形麦阵列驱动板上的接口,及其疑问

bing_feilong的博客 1176

【数据结构】顺序表与链表的比较

参考资料:《数据结构(C语言版)严蔚敏著》 版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。 文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。 本文正在施工中...请稍等... 1、存取方式 顺序表支持随机存取,而链表不支持,它只能从表头按顺序存取元素。 2、逻辑结构与存储结构 在顺序表中,逻...

WINGREZ‘S BLOG 7273

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

Ubuntu22.04下ROS2与PX4仿真环境搭建全流程解析

本文详细解析了在Ubuntu22.04系统下搭建ROS2与PX4仿真环境的全流程,包括系统准备、ROS2 Humble安装、PX4飞控环境部署、ROS2与PX4通信桥梁搭建等关键步骤。针对常见问题提供了解决方案,并分享了性能优化和开发调试技巧,帮助开发者快速构建无人机仿真开发环境。

weixin_29248653的博客 608

顺序表与链表的区别

顺序表与链表的比较区别

qq_73471456的博客 7229

活用QueryWrapper与@Select注解,构建MybatisPlus动态多表查询方案

本文深入探讨了如何结合MybatisPlus的QueryWrapper与@Select注解,构建高效灵活的动态多表关联查询方案。通过解析${ew.customSqlSegment}占位符机制,并设计通用的Service层封装,解决了复杂条件下多表查询的SQL拼接难题,显著提升了后台管理系统列表查询的开发效率与可维护性。

weixin_29291069的博客 271

【数据结构】链表与顺序表的比较

顺序表和链表比较

SWsunlight的博客 2158

【feature_column处理】- indicator_column(指示列)和embedding_column(嵌入列)

1. 开胃菜 我们先来了解一下tf.feature_column.input_layer def input_layer(features, feature_columns, weight_collections=None, trainable=True, cols_to_vars=None, cols_to_output_tensors=None)

DataAlgo 1488

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

天天酷科研的博客 246

顺序表和链表的6个区别|数据结构与算法分析|面试题|图解

附完整代码和解析图

VonClausewitz的博客 1182

Arduino、ESP32驱动BMP390L数字大气压传感器(压力传感器)

BMP390L是一款博世新研发的工业级专用数字气压传感器,具有极高的温度稳定性、低漂移、低功耗。

不脱发的程序猿 2014

数据结构——线性表:顺序表、单向链表、循环链表、双向链表

线性表 是一种数据结构:n个数据元素的有限序列 表示形式: L = (a1,a2...an) a1是线性表的元素,小写。 n=0时候为空表 数据元素具有相同特性 相邻元素之间存在序偶关系:即有唯一的第一和最后一个元素,除了第一个元素外,每个元素有且只有一个前驱,除最后一个元素外,有且只有一个后继。 定义数据类型构成list: 怎么具体实现 存储结构:顺序、链式...

tyfwin的博客 1380

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

Java数据结构之顺序表与链表

线性表 线性表是n个具有相同特性的数据元素的有限序列 常见顺序表:顺序表、链表、栈、队列、字符串 线性表在逻辑上是线性结构,也就说是连续的一条直线 线性表在物理结构上并不一定是连续的 线性表在物理上存储时,通常以数组和链式结构的形式存储。 线性表:数据在逻辑上有前后关系 顺序表 顺序表:用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储 顺序表的存储位置和逻辑关...

qq_39663771的博客 368

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

线性表中顺序表与链表的比较

一、线性表 线性表是n个数据特性相同的元素的组成有限序列,是最基本且常用的一种线性结构(线性表,栈,队列,串和数组都是线性结构),同时也是其他数据结构的基础。 对于非空的线性表或者线性结构的特点: (1)存在唯一的一个被称作“第一个”的数据元素; (2)存在唯一的一个被称作“最后一个”的数据元素; (3)除第一个外,结构中的每个数据元素均只有一个前驱; (4)除最后一个外,结构中的每个数据元素均只...

qq_43096062的博客 416

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

顺序表和链表对比

单链表适合需要频繁插入和删除、数据量不确定的场景,尤其是动态链表数据结构(如队列、栈)。顺序表适合数据量较小、访问较频繁、数据不经常变动的场景(如静态集合或数组)。选择哪个数据结构取决于应用的具体需求,例如,如果需要频繁地插入和删除数据,链表可能更合适;如果需要频繁地访问数据,顺序表会更加高效。

有梦想的电信狗 1054

顺序表和链表的优缺点总结

顺序表和链表之间的对比。

lfm1010123的博客 1万+

【顺序表和链表的对比】

顺序表和链表的对比

m0_56069910的博客 2557

【顺序表和链表】

文章目录一:线性表1.1 顺序表1.1.1 接口实现1.2 链表1.2.1 链表与数组的区别1.2.2 结构体的自引用1.2.3 链表的分类 一:线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表,链表,栈,队列,字符串等。 线性表在逻辑上是线性结构,也就是说是一条连续的实线,但其实在物理结构上不一定连续,其中线性表在储存的时候,通常以数组和链式结构的形式存储。 1.1 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性

qq_43727529的博客 1847

线性表——顺序表和链表

顺序表和链表的解释与实现

qq_65285898的博客 3820

顺序表和链表(一)

连续的物理地址连续(依次)存储数据(数组)一个数据存一个内存块中,用指针来链接。单链表的增删查改-优快云博客。通讯录-C语言-优快云博客。动态通讯录-优快云博客。

Xiaodao12345djs的博客 1463

【数据结构】顺序表和链表的对比,在各种情况下如何选择

顺序表:修改Length=0,静态分配系统自动回收空间,动态分配需要手动free。表长难估计,经常增、删元素 ——链表。顺序表:需要将元素前移/后移,时间复杂度。,开销主要来自查找目标元素。表长可估计,查询操作多 ——顺序表。如何选择用链表or顺序表?链表:依次free结点。顺序表:容易浪费内存。,开销来自移动元素。

m0_61628700的博客 1097

【数据结构】顺序表和链表优劣的对比分析

顺序表和链表是两种常见的线性表实现方式,各自有不同的特点、优缺点和适用场景。这篇文章是两者的详细对比和适用场景分析。

猫猫的小茶馆 1641

C语言顺序表和链表

slow走的路程是:L+X(slow一圈之内,fast必然追上slow,因为每次距离减一,不会错过)此时slow和fast的距离变成C-1,如果说C-1是偶数,那就变成了第一种情况,在这一轮恰好追上。解释:fast会先进环,slow会后进环,假设slow进环时,slow和fast之间的距离为N。N N-2 N-4 N-6 …如果说C-1是奇数,那这一轮又是第二种情况而且永无止境的是第二种情况,也就永远也追不上了。fast走的路程是:L+nC+X(n为slow进环前,fast在环里面转的圈数)

2202_75450092的博客 713
上一篇: 祝你开心吖
下一篇: 祝大家天天开心@
知困勉行的Allen
博客等级 码龄3年 279粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值