数据结构线性表的顺序存储结构

线性表是由零个或多个数据元素组成的有序序列。

特点:

  • 数据元素间是有顺序的;

  • 数据元素的个数是有限的;

  • 一般来说,数据元素的类型是相同的(强类型语言)。c/c++是强类型语言,必须指定数据类型。jsphppython等语言是弱类型就不需要指定数据类型。

线性表的顺序存储结构指的是用一段连续的存储空间来存储线性表中的数据元素,数组就是一个典型的顺序存储结构。

下面实现一个动态数组。

头文件

#pragma once
class DynamicArray
{
private://成员变量int* data;//data指向存放数据元素的内存空间,堆区空间,数据元素类型默认是整数int size;//动态数组的大小,多少个数据元素,也就是线性表的长度int capacity;//动态数组容量
public://特殊成员函数DynamicArray();//无参构造DynamicArray(int capacity);//有参构造~DynamicArray();//析构//普通成员函数//尾部添加元素void pushBack(int value);//打印动态数组void printDynamicArray();//在指定位置前插入元素void insertByIndex(int index,int value);//查询相关操作int getCapacity();//返回动态数组容量int getSize();//返回动态数组的大小int getValueByIndex(int index);//返回指定位置的元素int front();//返回动态数组第一个元素int back();//返回动态数组最后一个元素//删除元素void popBack();//删除最后一个元素void delByIndex(int index);//删除元素
};

源文件

#include<iostream>
#include"dynamicArray.h"
using namespace std;
#include<time.h>
DynamicArray::DynamicArray()//无参构造,初始化成员变量
{capacity = 5;//动态数组默认长度为5data = new int[capacity];//data指向五个大小的内存空间size = 0;
}
DynamicArray::DynamicArray(int capacity)//有参构造,传入容量
{this->capacity = capacity;data = new int[capacity];size = 0;
}
DynamicArray::~DynamicArray()//析构,释放内存空间
{if(data!=nullptr){delete[]data;data = nullptr;}
}
void DynamicArray::pushBack(int value)
{//考虑容量够不够if (capacity == size)//容量已满,需要扩容,扩充一倍{int* temp_data = new int[capacity * 2];//复制原始空间数据到新空间for (int i = 0; i < size; i++){temp_data[i] = data[i];}delete[]data;//释放原始空间data = temp_data;capacity = capacity * 2;}data[size] = value;size++;
}
void DynamicArray::insertByIndex(int index, int value)
{if (index<0 || index>size - 1){return;}if (capacity == size){int* temp_data = new int[capacity * 2];for (int i = 0; i < size; i++){temp_data[i] = data[i];}delete[]data;//释放原始空间data = temp_data;//更新成员变量capacity = capacity * 2;//更新容量//新元素插在index前,index开始的元素都往后移for (int i = size - 1; i >= index; i--){data[i + 1] = data[i];}data[index] = value;size++;}
}
void DynamicArray::printDynamicArray()
{for (int i = 0; i < size; i++){cout << data[i]<<" ";}cout << endl;
}
int DynamicArray::getCapacity()
{return capacity;
}
int DynamicArray::getSize()
{return size;
}
int DynamicArray::getValueByIndex(int index)
{if (index<0 || index>size - 1){return NULL;}return data[index];
}
int DynamicArray::front()
{if (size>0){return data[0];}return NULL;
}
int DynamicArray::back()
{if (size > 0){return data[size - 1];}return NULL;
}
void DynamicArray::popBack()
{if (size > 0){size--;}
}
void DynamicArray::delByIndex(int index)
{if (index<0 || index>size - 1){return;}for (int i = index; i < size - 1; i++){data[i] = data[i + 1];}size--;
}
void test_dynamicarray()
{//DynamicArray dy;DynamicArray* dy = new DynamicArray();//堆对象dy->pushBack(11);dy->pushBack(12);dy->pushBack(13);dy->pushBack(14);dy->pushBack(15);dy->printDynamicArray();dy->insertByIndex(2, 88);dy->printDynamicArray();cout<<"动态数组容量为"<<dy->getCapacity()<<endl;/*for (int i = 0; i < 5; i++){dy->pushBack(i + 20);}dy->printDynamicArray();cout << "动态数组容量为" << dy->getCapacity() << endl;*/cout << "动态数组的大小" << dy->getSize()<<endl;cout << "下标为三的元素" << dy->getValueByIndex(3) << endl;cout << "动态数组第一个元素是" << dy->front()<<endl;cout << "动态数组最后一个元素是" << dy->back() << endl;;dy->popBack();dy->printDynamicArray();dy->delByIndex(2);dy->printDynamicArray();delete dy;
}
void test_homework()
{srand((unsigned int)time(0));//srand(time(0));DynamicArray d;//DynamicArray* dy = new DynamicArray(8);for (int i = 0; i < 8; i++){d.pushBack(rand() % 41+60);//生成0-19之间的整数}//d.pushBack(5);//d.pushBack(7);//d.pushBack(8);//d.pushBack(6);//d.pushBack(2);//d.pushBack(1);//d.pushBack(9);d.printDynamicArray();for (int i = 0; i < d.getSize();){if (d.getValueByIndex(i)%2!=0){d.delByIndex(i);}else{i++;}}d.printDynamicArray();}
int main()
{//test_dynamicarray();test_homework();return 0;
}

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

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

相关文章

扣子空间试用:生成五一骑行规划+notion文章编写

今天试用了一下扣子空间&#xff0c;正好五一快到了&#xff0c;让它帮忙做了五一骑行规划&#xff0c;效果不赖&#xff01; 生成五一骑行规划 点击前往网站查看效果 prompt 如下&#xff1a; 帮我做一个五一上海骑行规划 要求&#xff1a; - 风景优美 - 人少 - 100km总路程…

最新得物小程序sign签名加密,请求参数解密,响应数据解密逆向分析

点击精选&#xff0c;出现https://app.dewu.com/api/v1/h5/index/fire/index 这个请求 直接搜索sign的话不容易定位 直接搜newAdvForH5就一个&#xff0c;进去再搜sign&#xff0c;打上断点 可以看到t.params就是没有sign的请求参数&#xff0c; 经过Object(a.default)该函数…

在C#串口通信中,一发一收的场景,如何处理不同功能码的帧数据比较合理,代码结构好

在 C# 串口通信的一发一收场景里&#xff0c;处理不同功能码的帧数据可采用以下合理的代码结构&#xff0c;它能让代码更具可读性、可维护性和可扩展性。 实现思路 定义帧结构&#xff1a;创建一个类来表示通信帧&#xff0c;其中包含功能码、数据等信息。功能码处理逻辑&…

【C++】vector扩容缩容

vector扩容缩容 1 扩容 一般来说&#xff0c;主要是重新分配内存 2 缩容 resize 缩小后&#xff0c;vector 的容量&#xff08;capacity()&#xff09;可能保持不变&#xff0c;需要显式调用 shrink_to_fit() 来释放内存。 验证代码&#xff1a; #include <vector>…

java中,线程的执行状态有哪些

在 Java 里&#xff0c;线程有 6 种执行状态&#xff0c;这些状态都在 java.lang.Thread.State 枚举类中被定义。下面为你详细介绍这些状态&#xff1a; 1. NEW&#xff08;新建状态&#xff09; 当你创建了一个 Thread 对象&#xff0c;却还未调用其 start() 方法时&#xf…

MATLAB 控制系统设计与仿真 - 41

鲁棒控制的其他函数 - 回路成型函数 loopsyn 灵敏度问题由鲁棒控制工具箱中的loopsyn就可以直接求解,该函数采用H无穷回路成型算法设计控制器,函数的调用格式为: [K,CL,gamma,info] = loopsyn(G,Gd) % G为受控对象模型% Gd为期望的回路传递函数% K为回路成型控制器模型% C…

查询Hologres或postgresql中的数据

因Hologres使用postgresql的语法.所以两者查询一样. 方案1: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;/*** 一个使用简单连接池管理PostgreSQL连接的工具类。*/ publi…

OpenBayes 一周速览|EasyControl 高效控制 DiT 架构,助力吉卜力风图像一键生成;TripoSG 单图秒变高保真 3D 模型

公共资源速递 10 个教程&#xff1a; * 一键部署 R1-OneVision * UNO&#xff1a;通用定制化图像生成 * TripoSG&#xff1a;单图秒变高保真 3D * 使用 VASP 进行机器学习力场训练 * InfiniteYou 高保真图像生成 Demo * VenusFactory 蛋白质工程设计平台 * Qwen2.5-0mni…

中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包

中兴云电脑W102D_晶晨S905X2_216G_mt7661无线_安卓9.0_线刷固件包 准备工作&#xff1a; 工具和设备在开始刷机之前&#xff0c;确保你已经准备好以下物品&#xff1a;双公头USB线&#xff1a;选择一根30-50厘米长的USB线&#xff0c;长度适中&#xff0c;方便操作&#xff0c;…

Rust 学习笔记:安装 Rust

Rust 学习笔记&#xff1a;安装 Rust Rust 学习笔记&#xff1a;安装 Rust在 Windows 上安装 Rust命令行创建 Rust 项目在 Mac/Linux 上安装 Rust一些命令升级卸载cargo -hrustc -h 安装 RustRoverrust-analyzer Rust 学习笔记&#xff1a;安装 Rust 在 Windows 上安装 Rust …

Opencv图像处理:轮廓检测、轮廓近似、绘制外接圆外接矩形

文章目录 一、图像轮廓检测1、比较2、常见的轮廓检测方法1&#xff09;基于梯度的方法2&#xff09;基于边缘检测器的方法3&#xff09;基于阈值的方法 3、查找轮廓与绘制轮廓4、参数解释4、代码解释1&#xff09;读取原图像灰度图并用二值化显示2&#xff09;轮廓绘制3&#x…

精益数据分析(17/126):精益画布与创业方向抉择

精益数据分析&#xff08;17/126&#xff09;&#xff1a;精益画布与创业方向抉择 大家好&#xff01;一直以来&#xff0c;我都希望能和大家一起在创业和数据分析的领域中不断探索、共同进步。今天&#xff0c;我们接着深入学习《精益数据分析》&#xff0c;这次聚焦于精益画…

每天五分钟深度学习PyTorch:图像的处理的上采样和下采样

本文重点 在pytorch中封装了上采样和下采样的方法,我们可以使用封装好的方法可以很方便的完成采样任务,采样分为上采样和下采样。 上采样和下采样 下采样(缩小图像)的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。 下采样( 放大图像)的…

代码随想录训练营第39天 || 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III

198. 打家劫舍 思路&#xff1a; 动规五部曲&#xff1a; 1.dp数组及其下标的意义&#xff1a;dp数组表示当前房屋下偷与不偷的最大盗取金额 2.确定递推公式&#xff1a;因为盗取房屋只能间隔盗取&#xff0c;并且还要取最大值。所以每个房屋都有盗取和不盗取两个选择&…

【AI 加持下的 Python 编程实战 2_09】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(上)

DIY 拓展&#xff1a;从扫雷小游戏开发再探问题分解与 AI 代码调试能力&#xff08;上&#xff09; 1 起因 最近在看去年刚出了第 2 版《Learn AI-assisted Python Programming》&#xff0c;梳理完 第七章 的知识点后&#xff0c;总感觉这一章的话题很好——问题分解能力的培…

使用DeepSeek-Prover-V1.5解决数学问题

DeepSeek-Prover-V1.5-RLRMaxTS是一个结合强化学习和搜索策略的自动定理证明系统。 1. 初等代数&#xff1a;二次方程求解 问题&#xff1a;解方程 x - 5x 6 0 操作步骤&#xff1a; 将问题转换为Coq形式&#xff1a; Theorem quadratic : exists x : Z, x^2 - 5*x 6 0…

3.3 技术框架:LangChain、ReAct、Memory与Tool Integration

随着人工智能技术的飞速发展&#xff0c;智能代理&#xff08;Agent&#xff09;已成为企业实现自动化、智能化和个性化服务的核心工具。在2025年&#xff0c;技术框架如LangChain、ReAct、Memory和Tool Integration在构建高效、灵活的AI代理系统中占据了重要地位。这些框架通过…

STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。

1. 启动模式与地址映射 STM32F103 的启动模式由 BOOT0 和 BOOT1 引脚配置决定&#xff0c;不同的启动模式对应不同的存储器映射&#xff1a; 启动模式 映射地址范围 说明 主 Flash 0x08000000~0x0807FFFF 用户程序存储在 Flash 中&#xff0c;复位后从 Flash 启动&#xff08…

【C语言-选择排序算法】实现对十个数进行排序

目录 前言 一、选择排序算法原理 二、选择排序算法实现对十个数进行排序 三、代码运行示例 四、选择排序算法的时间复杂度和空间复杂度分析 五、选择排序算法的优缺点 六、总结 前言 在计算机科学领域&#xff0c;排序算法是基石般的存在&#xff0c;它们就像是整理杂乱…

配置Intel Realsense D405驱动与ROS包

配置sdk使用 Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包_realsense的驱动包-CSDN博客 中的方法一 之后不通过apt安装包&#xff0c;使用官方的安装步骤直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 从这一步开始 执行完 这一步…