数据结构——顺序表的相关操作

一、顺序表基础认知​

1.顺序表的定义与特点​

顺序表是数据结构中一种线性存储结构,它将数据元素按照逻辑顺序依次存储在一片连续的物理内存空间中。简单来说,就是用一段地址连续的存储单元依次存放线性表的元素,且元素之间的逻辑关系通过物理位置的相邻关系直接体现。​

其核心特点包括:​

  • 物理存储连续:所有元素在内存中占据连续的存储空间,例如第 i 个元素的存储地址可通过首地址和元素大小计算(Loc (ai) = Loc (a0) + i×sizeof (元素类型))。​

  • 元素访问高效:支持随机访问,即通过下标可以直接定位到目标元素,时间复杂度为 O (1)。​

  • 容量固定或动态调整:静态顺序表的容量在初始化时确定,动态顺序表则可根据元素数量动态扩容或缩容。​

  • 插入删除效率低:若在中间位置插入或删除元素,需要移动大量后续元素以维持连续性,时间复杂度为 O (n)。

2.顺序表与数组的关联和区别​

顺序表与数组密切相关,但二者并非完全等同,具体关联和区别如下:​

关联:​

  • 顺序表的底层实现依赖数组:无论是静态还是动态顺序表,都会借助数组作为物理存储载体,利用数组的连续内存特性实现元素的线性排列。​

  • 元素访问方式一致:两者都支持通过下标直接访问元素,遵循 “随机访问” 的特性。

区别:

例如,在 C 语言中,数组是int arr[10]这样的固定大小容器,而顺序表则会通过结构体封装数组指针、当前长度和容量,如:​

typedef struct {int* data;   // 指向数组的指针int size;    // 当前元素个数int capacity; // 容量
} SeqList;

二、顺序表的初始化操作​

//1.初始化
void InitSeqList(SeqList* plist)
{//断言assert(plist != NULL);//1.给指针malloc分配内存ELEM_TYPE* p = (ELEM_TYPE*)malloc(sizeof(ELEM_TYPE) * SXQ_INIT_SIZE);if (NULL == p){printf("初始化malooc分配内存失败\n");return;}plist->arr = p;//2.个数plist->cursize = 0;//3.容量plist->capacity = SXQ_INIT_SIZE;
}

三、顺序表的核心操作​

1.插入元素(头部、中间、尾部)

//7.插入元素
bool InsertElem(SeqList* plist, int pos, ELEM_TYPE val)
{assert(plist != NULL);if (IsFull(plist)){if (IncMem(plist) == false){printf("无法插入\n");return false;}}if (pos<0 || pos>plist->cursize){printf("插入位置不合法\n");return false;}for (int i = plist->cursize - 1; i >= pos; i--){plist->arr[i + 1] = plist->arr[i];}plist->arr[pos] = val;plist->cursize += 1;return true;
}//8.尾插
bool Push_Back(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);plist->arr[plist->cursize] = val;plist->cursize++;return true;
}//9.头插
bool Push_Front(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);InsertElem(plist, 0, val);return true;
}

2.​删除元素(指定位置、指定值)​

//12.按位置删除
bool ErasePos(SeqList* plist, int index)
{assert(plist != NULL);if (IsEmpty(plist)){printf("删除失败\n");return false;}if (index<0 || index>plist->cursize){printf("删除失败\n");return false;}for (int i = index; i < plist->cursize; i++){plist->arr[i] = plist->arr[i + 1];}plist->cursize -= 1;return true;
}//13.按值删除(删一次)
bool RemoveElem(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);for (int i = 0; i < plist->cursize; i++){if (val == plist->arr[i]){ErasePos(plist, i);}}return true;
}//14.按值删除(删多次)
bool RemoveElemAll(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);int i = 0;while (i < plist->cursize){if (plist->arr[i] == val){ErasePos(plist, i);}else{i++;}}return true;
}//15.删除尾
bool Pop_Back(SeqList* plist)
{assert(plist != NULL);if (IsEmpty(plist)){return false;}ErasePos(plist, plist->cursize - 1);return true;
}//16.删除头
bool Pop_Front(SeqList* plist)
{assert(plist != NULL);if (IsEmpty(plist)){return false;}ErasePos(plist, 0);return true;
}

3.查找元素(按值查找、按位查找)

//11.查询
int FindValue(const SeqList* plist, ELEM_TYPE val)//没找到返回-1,找到了返回下标,有多个返回第一个
{assert(plist != NULL);if (IsEmpty(plist)){return -1;}for (int i = 0; i < plist->cursize; i++){if (plist->arr[i] == val){printf("找到了,下标为%d\n", i);return i;}}return -1;
}

四、顺序表的销毁操作​

//22.清除顺序表
bool ClearElem(SeqList* plist)
{assert(plist != NULL);plist->cursize = 0;return true;
}//23.销毁
void DestroySeqList(SeqList* plist)
{assert(plist != NULL);free(plist->arr);plist->arr = NULL;plist->cursize = 0;plist->capacity = 0;
}

五、反转、合并两个有序的顺序表

//24.反转顺序表
void Reverse_List(SeqList* plist)
{assert(plist != NULL);if (IsEmpty(plist)){return;}int left = 0;int right = plist->cursize - 1;while (left < right){int temp = plist->arr[left];plist->arr[left] = plist->arr[right];plist->arr[right] = temp;left++;right--;}
}//25.合并两个有序的顺序表
void Merge_List(SeqList* plist1, SeqList* plist2, SeqList* plist3)
{assert(plist1 != NULL && plist2 != NULL && plist3 != NULL);int i = 0, j = 0;while (i < plist1->cursize || j < plist2->cursize){if (plist1->arr[i] > plist2->arr[j]){Push_Back(plist3, plist2->arr[j]);j++;}else{Push_Back(plist3, plist1->arr[i]);i++;}if (i == plist1->cursize){while (j < plist2->cursize){Push_Back(plist3, plist2->arr[j]);j++;}}if (j == plist2->cursize){while (i < plist1->cursize){Push_Back(plist3, plist1->arr[i]);i++;}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914583.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?

在快节奏的 DevOps 时代&#xff0c;测试用例管理已不再是 QA 的独角戏&#xff0c;而是穿透需求—开发—测试—交付全流程的核心枢纽。想象一下&#xff0c;如果用例结构混乱&#xff0c;覆盖不全&#xff0c;甚至丢失版本变更历史&#xff0c;不仅协作乱&#xff0c;还影响交…

在线评测系统开发交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 实验内容爬虫Web系统设计数据分析实验指导爬虫Web系统设计自然语言处理与信息检索数据可视化评分标准FAQ实验二&#xff1a;在线评测系统实验概述实验内容Step1&#xff1a;题目管理Step2&#xff1a;题目评测S…

Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法

Linux操作系统从入门到实战&#xff08;十&#xff09;Linux开发工具&#xff08;下&#xff09;make/Makefile的推导过程与扩展语法前言一、 make/Makefile的推导过程1. 先看一个完整的Makefile示例2. make的工作流程&#xff08;1&#xff09;寻找Makefile文件&#xff08;2&…

NFS磁盘共享

步骤&#xff1a;注意事项‌&#xff1a;确保服务端防火墙关闭&#xff0c;或者允许2049端口通信&#xff0c;客户端需具备读写权限。服务器端安装NFS服务器&#xff1a;sudo apt-get install nfs-kernel-server # Debian/Ubuntu sudo yum install nfs-utils # Ce…

ORA-06413: 连接未打开

System.Data.OracleClient.OracleException:ORA-06413: 连接未打开 oracle 报错 ORA-06413: 连接未打开 db.Open();的报错链接未打开&#xff0c;System.Data.OracleClient.OracleException HResult0x80131938 MessageORA-06413: 连接未打开 关于ORA-06413错误&#xff08;…

【PCIe 总线及设备入门学习专栏 5.1.2 -- PCIe EP core_rst_n 与 app_rst_n】

文章目录 app_rst_n 和 core_rst_n 的作用1. core_rst_n — PCIe 控制器内部逻辑复位作用控制方式2. app_rst_n — 应用层/用户逻辑复位作用特点两者关系图示:示例流程(Synopsys EP)rst_sync[3] 的作用详解(复位同步逻辑)为什么使用 rst_sync[3]?图示说明Synopsys 官方手…

Python初学者笔记第二十期 -- (文件IO)

第29节课 文件IO 在编程中&#xff0c;文件 I/O&#xff08;输入/输出&#xff09;允许程序与外部文件进行数据交互。Python 提供了丰富且易用的文件 I/O 操作方法&#xff0c;能让开发者轻松实现文件的读取、写入和修改等操作。 IO交互方向 从硬盘文件 -> 读取数据 -> 内…

Java JUC包概述

Java 的 java.util.concurrent&#xff08;简称 JUC&#xff09;包是 JDK 5 及以后引入的并发编程工具包&#xff0c;旨在解决传统线程模型&#xff08;如 synchronized、wait/notify&#xff09;的局限性&#xff0c;提供更灵活、高效、可扩展的并发编程组件。它极大简化了多线…

LeetCode--44.通配符匹配

前言&#xff1a;不知不觉又断更一天了&#xff0c;其实昨天就把这道题写得差不多了&#xff0c;只是刚好在力扣里面看见了一种新的解法&#xff0c;本来想写出来的&#xff0c;但是我把它推到今天了&#xff0c;因为太晚了&#xff0c;但是今天又睡懒觉了&#xff0c;所以我直…

WHAT - 依赖管理工具 CocoaPods

文章目录1. 什么是 CocoaPods&#xff1f;2. 如何安装 CocoaPods&#xff1f;(1) 确保已安装 Ruby&#xff08;macOS 默认自带&#xff09;(2) 安装 CocoaPods(3) 验证安装3. 在 React Native 项目中使用 CocoaPods(1) 进入 iOS 目录(2) 初始化 Podfile&#xff08;如果不存在&…

C++ Boost Aiso TCP 网络聊天(服务端客户端一体化)

代码功能说明: 程序模式: 主动连接模式:当用户指定对端 IP 和端口时,尝试连接到对端被动监听模式:当用户未指定对端 IP 时,等待其他节点连接线程模型: 主线程:处理用户输入和消息发送接收线程:后台接收并显示对端消息关键组件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45猎人宝宝狼 技能恢复宏已知3.45BUG RL技能位会清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修复以前可用宏一键恢复状态-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…

对于编写PID过程中的问题

当stm32RCT6使用位置环pid控制麦轮转动一定路程时&#xff0c;在这个时间段内想让一边轮胎速度加大应该怎么做&#xff1f;比如我pid的目标脉冲值为9000&#xff0c;在运行到3000的时候车偏左了&#xff0c;那我应该怎样让他回正&#xff0c;我想到的办法是增加其最大的脉冲值&…

LeetCode|Day13|88. 合并两个有序数组|Python刷题笔记

LeetCode&#xff5c;Day13&#xff5c;88. 合并两个有序数组&#xff5c;Python刷题笔记 &#x1f5d3;️ 本文属于【LeetCode 简单题百日计划】系列 &#x1f449; 点击查看系列总目录 >> &#x1f4cc; 题目简介 题号&#xff1a;88. 合并两个有序数组 难度&#xf…

【C++】初识C++(1)

个人主页&#xff1a;我要成为c嘎嘎大王 希望这篇小小文章可以让你有所收获&#xff01; 目录 前言 一、C的第一个程序 二、命名空间 2.1 namespace 的价值 2.2 namespace 的定义 2.2.1 正常的命名空间定义 2.2.2 命名空间可以嵌套 2.2.3 匿名命名空间 2.2.4 同名的name…

在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换

在新闻资讯 APP 中添加不同新闻分类页面&#xff0c;通过 ViewPager2 实现滑动切换 核心组件的作用 ViewPager2&#xff1a;是 ViewPager 的升级版&#xff0c;基于RecyclerView实现&#xff0c;支持水平 / 垂直滑动、RTL&#xff08;从右到左&#xff09;布局&#xff0c;且修…

vuex操作state为什么要使用mutations作为规范而不是直接修改state

1. 状态变更的可追踪性 (Trackable Changes)Devtools 集成&#xff1a;Vue Devtools 可以捕获每次 mutation 的执行记录&#xff0c;记录变更前后的 state 快照、参数和调用栈。直接修改 state&#xff1a;Devtools 无法检测到变更来源&#xff0c;导致调试困难&#xff08;如无…

Spring AI 系列之九 - RAG-入门

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

【数据结构】基于顺序表的通讯录实现

目录 1 顺序表的概念及结构 1.1 线性表 1.2 顺序表分类 1.2.1 静态顺序表 1.2.2 动态顺序表 2 顺序表的实现 2.1 顺序表的初始化 2.2 顺序表中数据的增加和修改 2.2.1 顺序表的头插 2.2.2 顺序表的尾插 2.2.3 顺序表的头删 2.2.4 顺序表的尾删 2.2.5 顺序表指定位置…

C语言与汇编混合编程

一、GCC 扩展语法与MSVC约束 &#xff08;一&#xff09;GCC&#xff08;GNU Compiler Collection&#xff09;内联汇编语法 asm("汇编指令");#或者 __asm__("汇编指令");#使用更复杂的语法来指定输入、输出操作数和修改的寄存器&#xff1a; asm volatile…