当前位置: 首页 > news >正文

5.C++顺序表

一,顺序表的概念

顺序表是一种线性的数据结构,其中数据元素按照特定的顺序依次存储在连续的内存空间中。它由一系列元素组成,每个元素都与唯一的索引(或者叫下标)相关联,索引从0开始递增。 元素可以是整数,可以是浮点数,可以是任意类型,包括结构体或者对象,等等。

二,顺序表的元素插入

顺序表的元素插入,就是指给定一个索引和一个元素,将这个元素插入到对应的索引位置上,这个位置以后的所有元素都要往后移动一个位置。

第1步、判断插入位置是否合法,如果不合法则抛出异常(比如:原本只有5个元素,给定的索引是100,那显然这个位置是不合法的)。

第2步、如果顺序表已满,则需要扩容顺序表,一般是把原有顺序表的容量进行倍增。

第3步、将插入位置之后的元素向后移动,为新元素腾出空间。

第4步、将新元素插入到指定位置。

第5步、更新顺序表的大小。

三,顺序表的元素删除

顺序表的元素删除,就是指给定一个索引,将这个索引上的元素删除,并且把这个索引位置以后的所有元素都往前移动一个位置。

第1步、判断删除位置是否合法,如果不合法则抛出异常。

第2步、如果删除位置为最后一个元素,直接将顺序表的大小减 1。

第3步、如果删除位置不是最后一个元素,将删除位置之后的元素向前移动,覆盖要删除的元素。

第4步、更新顺序表的大小。

四,顺序表的元素查找

顺序表的元素查找(也叫 “查找 / 检索”),是指在给定的顺序表中,根据指定的条件(比如 “查找值为 X 的元素” 或 “查找索引为 i 的元素”),确定目标元素是否存在、以及它在顺序表中的位置(索引)的操作。

第1步、遍历整个顺序表,对顺序表中的每个元素,和指定元素进行比较,如果相等则返回当前的索引;

第2步、如果遍历完所有的顺序表元素,都没有找到相等的元素,则返回 -1;

五,顺序表的元素索引

顺序表的元素索引,是指给定一个索引值,通过下标访问,直接在顺序表中获取元素的值,时间复杂度 O(1)。

直接通过索引,访问,获得对应元素的值即可。

六,顺序表的元素修改

将顺序表中指定的元素更新为新的值。

七,C嘎嘎实现

#include <iostream> using namespace std; //线性表元素的类型 #define eleType int //顺序表结构体定义 typedef struct SequentialList { eleType* elements; // 存储数据的数组 int size; // 当前元素个数 int capacity; // 数组容量 } SequentialList; // 初始化顺序表 void initializeList(SequentialList* list, int capacity) { //申请存储空间 list->elements = new eleType[capacity]; //初始化元素个数和容量 list->size = 0; list->capacity = capacity; } // 销毁顺序表 void destroyList(SequentialList* list) { delete[] list->elements; list->elements = nullptr; list->size = 0; list->capacity = 0; } // 判断顺序表是否为空 bool isEmpty(const SequentialList* list) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return true; } //判断元素个数是否为0 return list->size == 0; } // 判断顺序表是否已满 bool isFull(const SequentialList* list) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return true; } //判断数组是否已满 return list->size == list->capacity; } // 扩容顺序表(倍增策略) void expandList(SequentialList* list) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return; } int newCapacity = list->capacity * 2; eleType* newElements = new eleType[newCapacity]; for (int i = 0; i < list->size; i++) { newElements[i] = list->elements[i]; } delete[] list->elements; list->elements = newElements; list->capacity = newCapacity; cout << "扩容完成,新容量:" << newCapacity << endl; } // 插入元素到指定位置 bool insertElement(SequentialList* list, int index, eleType element) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return false; } //判断插入位置是否合法 if (index < 0 || index > list->size) { cout << "插入位置不合法" << endl; return false; } //判断是否已满 if (isFull(list)) { cout << "顺序表已满,正在扩容..." << endl; expandList(list); } // 后移元素 //从最后索引开始,将元素后移一位 for (int i = list->size; i > index; i--) { list->elements[i] = list->elements[i - 1]; } // 插入元素 list->elements[index] = element; //元素个数加1 list->size++; return true; } // 删除指定位置的元素 bool deleteElement(SequentialList* list, int index) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return false; } //范围检测 if (index < 0 || index >= list->size) { cout << "删除位置不合法" << endl; return false; } // 前移元素 //从索引开始,将元素前移一位 for (int i = index; i < list->size - 1; i++) { list->elements[i] = list->elements[i + 1]; } // 元素个数减1 list->size--; return true; } // 按值查找元素,返回索引,未找到返回-1 int findElement(const SequentialList* list, eleType target) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return -1; } //遍历查找 for (int i = 0; i < list->size; i++) { if (list->elements[i] == target) { return i; } } //未找到 return -1; } // 按索引获取元素 eleType getElement(const SequentialList* list, int index) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return -1; // 这里返回-1仅作示意,可根据实际需求调整 } //范围检测 if (index < 0 || index >= list->size) { cout << "索引不合法" << endl; return -1; // 这里返回-1仅作示意,可根据实际需求调整 } return list->elements[index]; } // 修改指定位置的元素 bool modifyElement(SequentialList* list, int index, eleType newElement) { //判断数组是否为空 if (list->elements == nullptr) { cout << "顺序表未初始化" << endl; return false; } // 检测索引是否合法(必须是已存在元素的索引) if (index < 0 || index >= list->size) { cout << "修改位置不合法" << endl; return false; } // 直接修改指定索引的元素值 list->elements[index] = newElement; return true; } // 打印顺序表 void printList(const SequentialList* list) { //判断数组是否为空 if (isEmpty(list)) { cout << "顺序表为空" << endl; return; } cout << "顺序表内容:"; for (int i = 0; i < list->size; i++) { cout << list->elements[i] << " "; } cout << endl; } // 测试主函数 int main() { SequentialList list; cout << "初始化顺序表..." << endl; initializeList(&list, 5); // 初始化容量为5 insertElement(&list, 0, 10); insertElement(&list, 1, 20); insertElement(&list, 2, 30); insertElement(&list, 1, 15); // 在索引1处插入15 cout << "插入元素后:"; printList(&list); // 输出: 顺序表内容:10 15 20 30 cout << "索引2处的元素:" << getElement(&list, 2) << endl; // 输出: 20 int target = 20; int pos = findElement(&list, target); if (pos != -1) { cout << "元素" << target << "的索引:" << pos << endl; // 输出: 2 } else { cout << "未找到元素" << target << endl; } deleteElement(&list, 1); // 删除索引1处的元素 cout << "删除后:"; printList(&list); // 输出: 删除后:顺序表内容:10 20 30 // 测试修改功能 modifyElement(&list, 1, 200); // 将索引1的元素改为200 cout << "修改后:"; printList(&list); // 输出: 修改后:顺序表内容:10 200 30 // 测试非法修改(索引越界) modifyElement(&list, 5, 999); // 输出: 修改位置不合法 destroyList(&list); return 0; }

运行:

http://www.jsqmd.com/news/366829/

相关文章:

  • 主管护师考前押题卷准吗?深度复盘2026年Top3押题卷命中率,快收藏! - 医考机构品牌测评专家
  • 基于单片机的两路PWM信号输出及频率占空比相位差调节系统 - 指南
  • 从零开始:亚洲美女-造相Z-Turbo的完整使用流程解析
  • Webpack Module Federation 微前端 + Monorepo 大仓架构 结合 物料化低代码平台 实战落地
  • 2026年热门的椰壳活性炭/柱状活性炭供应商推荐怎么联系(畅销) - 品牌宣传支持者
  • 2026四川墙面地面辅材实力榜:抗裂砂浆腻子粉领衔,找平石膏、瓷砖胶、自流平全系优选 - 深度智识库
  • 2026主管护师机构2月最新测评:3梯队实力排行出炉,适配不同考生需求 - 医考机构品牌测评专家
  • 2026主管护师培训机构怎么选?3大红榜机构深度解析,一篇文章给你答案! - 医考机构品牌测评专家
  • 2026年评价高的纺织软件/软件市场占有率排名推荐 - 品牌宣传支持者
  • 2026年比较好的无油铜套/自润滑铜套直销厂家价格参考怎么选 - 品牌宣传支持者
  • 2026年质量好的高碘值活性炭/Vocs 活性炭制造厂家选购指南怎么选(精选) - 品牌宣传支持者
  • 基础差也能过!2026 主管护师零基础备考全攻略,稳扎稳打提分 - 医考机构品牌测评专家
  • 2026年PE管厂家最新推荐榜,技术实力与市场口碑深度解析PE管/PVC管/复合管公司推荐 - 深度智识库
  • 健康白酒排行榜最新出炉!毛铺草本酒登顶,百元内口粮酒首选 - 资讯焦点
  • 2026基础薄弱备考主管护师?3大策略+4类资源助考生稳步逆袭 - 医考机构品牌测评专家
  • 2026年质量好的定制工厂静音轨道/全屋定制静音轨道直销厂家采购指南如何选 - 品牌宣传支持者
  • 6.C嘎嘎STL vector
  • 3D打印机,走出极客圈
  • 节日送礼酒水推荐:选酒不踩坑,毛铺紫荞酒首选更体面 - 资讯焦点
  • 树莓派兼容的文字处理软件推荐
  • 3.空间复杂度
  • 2026年靠谱的橡塑隔热棉/橡塑隔音材料哪家质量好厂家实力参考 - 品牌宣传支持者
  • 【课程设计/毕业设计】基于springboot的学生档案管理系统用于各类学校档案管理提升校园信息化水平【附源码、数据库、万字文档】
  • 百元内口感柔和的白酒首选!毛铺绿荞领衔,自饮宴请都合适 - 资讯焦点
  • 2026年评价高的大提花工艺培训/梭织鞋面培训实操强化课程推荐 - 品牌宣传支持者
  • 2026年比较好的定制工厂零角度铰链/德国高端零角度铰链高评价直销厂家采购指南推荐(高评价) - 品牌宣传支持者
  • 计算机Java毕设实战-基于springboot的软件测试管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026年2月金属检测机厂家推荐,资质齐全、售后完善的供应商精选 - 品牌鉴赏师
  • 2026年NAD+产品排行榜,十款抗衰nad+品牌推荐,哪个产品效果、功效、口碑、性价比最好? - 资讯焦点
  • 2026欧洲自由行全流程指南:新手从行程规划到聪明订票的一站式攻略 - 资讯焦点