顺序表与链表的对比(二)

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

上一篇文章《顺序表与链表的对比(一)》中给小伙伴们分享了顺序表与链表的初始化及定义,那么这篇将详细的给小伙伴们分享关于它们增(插入)的一些知识。

顺序表与链表的增

增可以理解为往里面添加数据,一般也叫插入数据。插入的方式分几种,可以选择在头部插入(简称 ”头插“ ),也可以在尾部插入(简称 “尾插” ),中间插入也可以,适用于不同的应用场景。

顺序表插入应用场景

顺序表使用连续的内存空间来存储数据,这使得数据的访问非常快速,因为可以通过索引直接访问任何元素。

优点:

  • 快速访问:通过索引可以直接访问任何元素,时间复杂度为O(1)。

  • 内存局部性:由于数据存储在连续的内存空间中,CPU缓存可以更有效地工作,提高访问速度。

缺点:

  • 固定大小:数组的大小在创建时确定,扩容需要重新分配内存并复制数据,成本较高。

  • 插入和删除成本高:在数组中间插入或删除元素需要移动大量元素,时间复杂度为O(n)。

应用场景:

  1. 数据访问频繁:当需要频繁访问数据时,数组是更好的选择,因为它提供了快速的随机访问能力。

  2. 数据量固定:当数据量不会频繁变化时,使用数组可以避免动态扩容的开销。

  3. 简单实现:对于简单的应用,数组的实现更直观和简单。

链表插入应用场景

链表通过节点之间的链接来存储数据,每个节点包含数据和指向下一个节点的指针。

优点:

  • 动态大小:链表的大小可以动态变化,不需要预先分配固定大小的内存。

  • 插入和删除效率高:在已知位置的节点前后插入或删除节点只需要改变指针,时间复杂度为O(1)。

缺点:

  • 访问速度慢:访问链表中的元素需要从头节点开始遍历,时间复杂度为O(n)。

  • 内存开销:每个节点需要额外的内存来存储指针。

应用场景:

  1. 频繁插入和删除:当需要频繁在数据结构中插入或删除元素时,链表是更好的选择,因为它可以高效地处理这些操作。

  2. 数据量变化大:当数据量可能会有较大变化时,链表可以动态调整大小,避免频繁扩容的开销。

  3. 内存碎片:在内存碎片较多的环境中,链表可以更好地利用内存。

选择顺序表还是链表,主要取决于应用的具体需求:

  • 如果应用需要频繁访问元素,且数据量相对固定,顺序表是更好的选择。

  • 如果应用需要频繁插入和删除元素,且数据量可能会有较大变化,链表是更好的选择。

在实际应用中,还可以根据具体情况选择其他数据结构,如栈、队列、哈希表等,以满足特定的需求

顺序表进行头插或者中间插入时,需保证数组空间充足,因为将首位置腾出空来时,需要将以前的数组元素往后挪位置,时间复杂度位O(n),若数组空间不够,容易引起数组越界问题。如果需要进行频繁的头插时,可以考虑使用链表结构。不过顺序表的尾插还是方便的,时间复杂度位O(1)但也要注意数组空间是否充足。

链表进行头插时,效率比顺序表要高,因为它不需要挪动数据,只需改变指针指向即可。但是进行中间插入时,如果不知道插入位置,则需要遍历链表,时间复杂度位O(n),也挺麻烦。先看代码吧~

1.顺序表的头插

// 头插法插入元素
void headInsert(SL *list, int x)
 {
    if (list->n == list->capacity) {
        // 如果空间满了,扩容
        list->capacity *= 2;
        list->arr = (int*)realloc(list->arr, list->capacity * sizeof(int));
    }
    // 元素后移
    for (int i = list->n; i > 0; i--) {
        list->arr[i] = list->arr[i - 1];
    }
    // 插入新元素
    list->arr[0] = x;
    // 更新长度
    list->n++;
}

2.1 单链表的头插

// 头插法插入
void insertAtHead(Node** head, int data) 
{
    Node* newNode = createNode(data);
    newNode->next = *head; 
    //注意赋值先后顺序!!!
    *head = newNode;
}

2.2 双链表的头插

// 头插法插入
void insertAtHeadDoubly(Node** head, int data)
{
    Node* newNode = createNode(data);
    newNode->next = *head;
    if (*head != NULL)
    {
        (*head)->prev = newNode;
    }
    *head = newNode;
}

3.顺序表的尾插

顺序表的尾插其实跟头插差不多。只不过不需要挪动数据,注意好数组空间是否充足就行。

// 尾插法插入元素
void insertAtTail(SeqList *list, int data) 
{
    if (list->n == list->capacity)
    {
        // 如果空间满了,扩容
        list->capacity *= 2;
        list->arr = (int*)realloc(list->arr, list->capacity * sizeof(int));
    }
    list->arr[list->n] = data;
    list->n++;
}

4.1单链表的尾插

链表进行尾插时,需要检查链表是否为空,防止出现空指针问题。

// 尾插法插入
void insertAtTail(Node** head, int data) 
{
    Node* newNode = createNode(data);
    if (*head == NULL) 
    {
        *head = newNode;
        return;
    }
    Node* temp = *head;
    while (temp->next != NULL) 
     {
        temp = temp->next; //找尾结点
    }
    temp->next = newNode;
}

4.2 双链表的尾插

与单链表一样,需检查链表是否为空,不过如果带有哨兵位的头节点时,可以省略。

// 尾插法插入
void insertAtTailDoubly(Node** head, int data) 
{
    Node* newNode = createNode(data);
    if (*head == NULL)
    {
        *head = newNode;
        return;
    }
    Node* temp = *head;
    while (temp->next != NULL) 
    {
        temp = temp->next;
    }
    temp->next = newNode;
    newNode->prev = temp;
}

5.1单链表的随机插入

如果知道需要插入的位置时,就不用遍历,另外这里可以再单独写一个函数用来查找位置,通过其返回的指针,来进行插入(也可分前插和后插),后续删除也会使用到。

// 指定位置插入
void insertAtPosition(Node** head, int data, int position) 
{
    if (position == 0)
     {
        insertAtHead(head, data);
        return;
    }
    Node* newNode = createNode(data);
    Node* temp = *head;
    for (int i = 0; i < position - 1 && temp != NULL; i++)
     {
        temp = temp->next;
    }
    if (temp == NULL)
     {
        free(newNode);
        return; // 位置无效
    }
    newNode->next = temp->next;
    temp->next = newNode;
}

5.2双链表的随机插入

// 指定位置插入
void insertAtPositionDoubly(Node** head, int data, int position) 
{
    if (position == 0) 
    {
        insertAtHeadDoubly(head, data);
        return;
    }
    Node* newNode = createNode(data);
    Node* temp = *head;
    for (int i = 0; i < position - 1 && temp != NULL; i++) 
    {
        temp = temp->next;
    }
    if (temp == NULL) 
    {
        free(newNode);
        return; // 位置无效
    }
    newNode->next = temp->next;
    if (temp->next != NULL) 
    {
        temp->next->prev = newNode;
    }
    temp->next = newNode;
    newNode->prev = temp;
}

希望你开心吖@

深入解析Android Thermal框架:从应用层到驱动层的温度管理机制 本文深入解析Android Thermal框架的温度管理机制,从应用层到驱动层详细介绍了温度监测、热状态评估和降温策略执行的全过程。通过分层架构解析和关键组件交互,帮助开发者理解Android设备如何实现高效的温度控制,确保硬件安全并优化性能。 阅读详情

相关推荐

Vue3 + MQTT.js 实现 SCADA 实时数据通信:从不稳定到稳定的完整实践

本文介绍了SCADA组态引擎开发中MQTT协议的应用及优化实践。项目采用MQTT协议实现工业设备数据采集与可视化,但面临连接不稳定、数据格式多样化和数据绑定复杂三大问题。针对MQTT连接问题,分析发现超时设置过短(原8秒)、缺少客户端超时配置和心跳机制是主要原因。优化方案包括:协议转换(mqtt://→ws://)、双重超时保护(15秒手动+30秒客户端)、60秒心跳间隔等,显著提升了连接稳定性。通过完整代码实现展示了连接配置、认证处理和错误处理机制,为物联网数据传输提供了可靠解决方案。

weixin_36794508的博客 1403

顺序表和链表的比较

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

icbbm的博客 4126

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

lichensun的博客 1万+

顺序表和链表对比

1、底层结构上 顺序表底层结构是一段连续的空间(也可以这么说顺序表底层空间是逻辑上和物理上都是连续的) 链表底层结构是动态的创建不连续的空间(链表底层是逻辑上连续,物理上不连续) 2、随机访问 顺序表支持随机访问,访问某个元素效率为o(1) 链表不支持随机访问,访问某个元素的效率为o(n) 3、插入和删除效率 顺序表的插入删除效率低,需要搬移元素,时间复杂度为o(n),并且再插入的时候还有可能需要...

qq_43514458的博客 665

从硬件异常到代码救赎:RH850内存访问错误(MAE)的深层诊断与艺术

本文深入探讨瑞萨RH850微控制器的内存访问错误(MAE)诊断与解决方法。针对程序跑飞和Flash Driver交互中的潜在陷阱,提供系统性硬件异常分析框架和防御性编程实践,帮助嵌入式开发者从底层机制到代码层面有效预防和修复MAE问题,提升系统稳定性。

pytorch8learner的博客 197

2.2 顺序表与链表特性对比

插入策略:在某个位置插入元素时, 把从该位置开始的所有元素都往后挪一个位置, 规定顺序表最后一个元素后面的位置也是一个可插入位置.删除策略:在某位置删除元素, 把从该位置之后的所有元素都往前挪一个位置, 把要删除的元素覆盖掉即可.代码1: 顺序表(数组)的插入删除操作。

oncruise的博客 299

python -- 海洋气象科研论文中常用绘图配色汇总

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。可以通过自定义选取不同颜色的rgb,通过自定义的方式构建colormap。

weixin_68789096的博客 973

顺序表与链表的不同

顺序表与链表 1.逻辑结构 顺序表与链表的逻辑结构均为线性结构,都属于线性表。 2.存储结构 顺序表是顺序存储,因此其可以随机存取,只要知道顺序表的起始地址,则可以立即找到第i个元素的起始位置。且由于不存储其他冗余信息。 因此顺序表 优点为:可随机存储,存储密度高。 缺点为:大片连续空间分配不方便,改变容量不方便。 链表是链式存储, 优点为:离散的小空间分配方便,改变容量方便。 缺点为:不可随机存取,存储密度低。 3.基本操作 创销、增删改查 创建的不同: 顺序表:需要预分配大片连续空间;若分配空间过小,则

qwe954443563的博客 1897

Spring AI Alibaba实战训练营-14基于A2A协议智能体应用开发指南

本文介绍了基于A2A协议的智能体应用开发流程,主要包括客户端和服务端两个模块的实现。关键技术包括A2A通信协议、Nacos服务发现、Spring AI Alibaba框架和DashScope通义千问API。开发步骤涵盖环境准备(JDK17、Maven、Nacos)、项目创建、依赖配置(重点引入spring-ai-alibaba相关组件)以及Nacos和DashScope的核心配置。整个系统架构采用客户端通过Nacos发现服务端Agent,再调用阿里云AI服务的模式,实现了AI能力的解耦与复用。

program哲学 506

YOLOv11改进策略【Head】| AFPN渐进式自适应特征金字塔,增加针对小目标的检测头(附模块详解和完整配置步骤)

一、本文介绍 本文利用AFPN对YOLOv11的网络模型进行优化提升。AFPN采用渐近式融合及自适应空间融合操作。通过渐近式架构,逐步整合不同层级特征,有效避免非相邻层级间因语义差距过大导致的信息丢失或降级问题,确保在多尺度特征融合过程中既能保留高层语义信息,又能融入低层细节特征。本文将AFPN应用于YOLOv11中,并配置了针对小目标的检测头,能显著增强模型对不同尺度目标的检测能力,使其在复杂场景下更聚焦于目标物体特征,减少背景等无关信息的影响。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、

Limiiiing的博客 2718

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

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

WINGREZ‘S BLOG 7273

代谢组数据分析(三十一):空间代谢组学分析从数据加载到通路分析的流程解析

空间代谢组学是一种先进的技术,能够在组织切片上以高分辨率检测代谢物分布,为理解生物代谢过程提供新视角。其分析流程包括数据获取、预处理、代谢物注释、差异表达分析、可视化、通路分析、聚类分析及空间相关代谢物分析等关键步骤。这些步骤帮助研究人员从海量数据中提取有价值信息,揭示代谢物的空间分布规律,发现潜在生物标志物,探索代谢通路调控机制。例如,SpaMTP等工具为全流程分析提供了强大支持,助力研究人员高效处理数据,深入理解代谢过程,为生物学研究和临床应用提供重要依据。

专注生信领域 922

【数据结构】汇总二、线性表(逻辑结构、物理(存储)结构、基本操作、1.顺序表2.单链表3.双链表4.循环链表5.静态链表6.顺序表与链表的对比不同)

10//静态链表的最大长度//静态链表结构类型的定义,并且使用typedef进行重命名为SLinkList[MaxSize]//存储数据元素int next;//下一个元素的数组下标//数组a作为静态链表//等同于链表定义形式,这样可以使用StackLink来创建静态链表的节点,使用来创建指向静态链表节点的指针。//数据域int cur;//游标//例如,可以使用以下方式创建一个静态链表节点:p = &node;

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

VC中sqlite的使用

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

visio安装包

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

数据结构基础篇(二):顺序表与链表全方位对比|从内存布局到 CPU 缓存理解底层差异

顺序表和链表的本质差异在于内存连续性。顺序表(动态数组)物理内存连续,支持O(1)随机访问,CPU缓存利用率高,但扩容需拷贝;链表节点离散存储,插删灵活但访问需遍历,且内存碎片和缓存不友好导致实际性能较差。虽然链表的“插删O(1)”需已知节点位置,但多数场景下顺序表因缓存和遍历优势更受青睐。理解硬件层面的内存与缓存机制,才能在实际工程中选择合适的数据结构,例如栈优先用数组实现。数据结构的选择本质是时间、空间与灵活性的权衡。

Luminousone的博客 475

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

代码随想录链表章二刷

链表,具有两个关键模块:指针域和数据域,指针域指向下一链表节点,数据域存储当前节点的数据链表和顺序表类似,同属于线性表这一数据结构大分支。

2403_88533484的博客 804

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

今天给小伙伴们分享的是在数据结构中顺序表和链表的对比

Code_Allen的博客 1385

顺序表与链表的区别

顺序表与链表的比较区别

qq_73471456的博客 7229

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

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

猫猫的小茶馆 1641

二.顺序表和链表

本文系统介绍了线性表的数据结构,重点分析了顺序表和链表的实现与应用。顺序表采用数组存储,支持随机访问但插入删除效率低;链表通过指针连接节点,插入删除高效但不支持随机访问。详细讲解了静态/动态顺序表的实现,包括初始化、扩容、增删查改等操作,并给出相关算法题解。针对链表,阐述了单链表和双向链表的实现方法,涵盖头尾操作、指定位置处理等核心功能,同时提供了链表常见问题的解决方案。最后对比了两种结构的优缺点:顺序表适合频繁访问,链表适合频繁插入删除。全文通过代码示例和复杂度分析,深入浅出地呈现了线性表的核心知识点。

wyzy_Dawn的博客 975

数据结构(二)顺序表和链表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

weixin_73496371的博客 2037

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

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

lfm1010123的博客 1万+

顺序表与链表

一、顺序表和链表的比较 1.存取方式 顺序表可以顺序存取,也可以随机存取,链表只能从表头顺序存取元素。 2.逻辑结构与物理结构 顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻; 链式存储时,逻辑上相邻的元素,物理存储位置不一定相邻,其逻辑关系是通过指针链接来表示的。 3.查找、插入和删除操作 对于按值查找,顺...

lipengfei0427的博客 7205

【顺序表和链表的对比】

顺序表和链表的对比

m0_56069910的博客 2557

对比顺序表与链表——纵观与取舍

从大局纵观拿捏 顺序表与链表之间的爱与恨

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值