数组的定义及实现

devtools/2024/9/19 7:40:42/ 标签: 数据结构

文章目录

  • 前言
  • 一、定义
  • 二、抽象数据类型定义
  • 三、顺序存储
  • 四、具体实现
  • 总结


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。


一、定义

  数组:由类型相同的数据元素构成的有序集合。
  数据元素:受 n(n>=1) 个线性关系的约束,在 n 个线性关系中的序号i1,i2, …,in称为该元素的下标,可以通过下标访问该数据元素。因为数组中每个元素处于n(n>=1) 个关系中,故称该数组为 n 维数组。
  数组是线性表的推广,其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型。例如,一维数组可以看成是一个线性表,二维数组可以看成数据元素是线性表的线性表。

二、抽象数据类型定义

  数组一旦被定义, 它的维数和维界就不再改变。 因此, 除了结构的初始化和销毁之外, 数组只有存取元素和修改元素值的操作。
  数组的抽象数据类型定义为:

ADT Array{
数据对象: ji=0, ···,bi-1, i=1, 2, …, n,
D = { aj1j2…jn | n(n>0)称为数组的维数,bi是数组第 i 维的长度,
ji是数组元素的第 1 维下标,aj1j2…jn∈ElemSet }
数据关系: R = {Rl,R2, …, Rn}
基本操作:
InitArray (&A, n, bound i, ···, boundn)
操作结果:若维数n和各维长度合法, 则构造相应的数组A, 并返回OK。
DestroyArray (&A)
操作结果:销毁数组A。
Value(A,&e, index1, …, indexn)
初始条件:A是 n 维数组,e 为元素变量,随后是n个下标值。
操作结果:若各下标不超界,则e赋值为所指定的 A 的元素值,并返回OK。
Assign(&A,e, index1, …,indexn)
初始条件:A是 n 维数组,e 为元素变量,随后是 n 个下标值。
操作结果:若下标不超界,则将 e 的值赋给所指定的A的元素,并返回OK。
} ADT Array

三、顺序存储

  由于数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。因此,采用顺序存储结构表示数组比较合适。
  由于存储单元是一维的结构,而数组可能是多维的结构,则用一组连续存储单元存放数组的数据元素就有次序约定问题。一般有以行序优先和以列序优先两种方式。在扩展 Basic 、Pascal 、Java 和 C 语言中,用的都是以行序为主序的存储结构,而在 FORTRAN 语言中,用的是以列序为主序的存储结构。
  假设每个数据元素占 L 个存储单元, 则二维数组 A[0… m-1, 0 … n-1] (即下标从 0 开始, 共有 m 行 n 列)中任一元素 aij 的存储位置可由下式确定:
          LOC(i, j) = LOC(0, 0) + (n * i + j ) *L
式中, LOC(i,j)是 aij 的存储位置; LOC(0, 0) 是 a00 的存储位置, 即二维数组 A 的起始存储位置,也称为基地址或基址。
  由此可知,数组是一种随机存取结构。

四、具体实现

#include <iostream>
using namespace std;#define maxline 5
#define maxcolu 5
#define maxpage 5
#define maxdime 5#define fail 0;
#define ok 1;typedef int status;typedef int Elemtype;typedef struct {Elemtype* Addr;  //数组基地址int dime;    //维数int page;    //页维int line;    //行维int colu;    //列维int length;  //数组长度
}Array;//初始化数组
status InitArray(Array&A, int n,int bound1,int bound2,int bound3)
{if (n<0 || n>maxdime)return fail;A.Addr = NULL;if (n == 1 && bound1 > 0 && bound1 < maxline)A.Addr = new Elemtype[bound3];else if (n == 2 && bound1 > 0 && bound1 < maxline && bound2 > 0 && bound2 < maxcolu)A.Addr = new Elemtype[bound3 * bound2];else if (n == 3 && bound1 > 0 && bound1 < maxline && bound2 > 0 && bound2 < maxcolu && bound3 > 0 && bound3 < maxpage)A.Addr = new Elemtype[bound3 * bound2 * bound1];if (!A.Addr)return fail;A.dime = n; A.page = bound1; A.line = bound2; A.colu = bound3;A.length = bound1 * bound2 * bound3;return ok;
}
//销毁数组
status DestroyArray(Array& A)
{delete[] A.Addr;A.Addr = NULL;A.length = 0;return ok;
}
//注意,无需乘以数据元素长度sizeof(Elemtype),因为A.Addr在new时已经分配好了各个元素的空间位置
//如果乘以数据元素长度sizeof(Elemtype),会导致堆错误
status Value(const Array A, Elemtype* e, int index1,int index2,int index3)
{if (!A.length)return fail;*e = *(A.Addr + (index1 * A.line * A.colu + index2 * A.colu + index3));return ok;
}
//注意,无需乘以数据元素长度sizeof(Elemtype),因为A.Addr在new时已经分配好了各个元素的空间位置
//如果乘以数据元素长度sizeof(Elemtype),会导致堆错误
status Assign(const Array A, Elemtype* e, int index1, int index2, int index3)
{if (!A.length)return fail;*(A.Addr + (index1 * A.line * A.colu + index2 * A.colu + index3) ) = *e;return ok;
}Array a;
Elemtype e = 0;
int main()  //测试程序
{InitArray(a, 3, 2, 2, 2);cout << a.length << endl;for (int i = 0; i<a.page; i++)for(int j=0;j<a.line;j++)for (int z = 0; z < a.colu; z++){Assign(a, &e, i, j, z);e++;}for (int i = 0; i < a.page; i++)for (int j = 0; j < a.line; j++)for (int z = 0; z < a.colu; z++){Value(a, &e, i, j, z);cout << e << " ";}cout << a.Addr << endl;cout << a.Addr+1 << endl;return 0;
}

&emps; 测试现象:在这里插入图片描述


总结

  路漫漫其修远兮,吾将上下而摆烂。(delete你少报点错!_ !)
  有任何疑问和补充,欢迎交流。(但我显然不会T_T)


http://www.ppmy.cn/devtools/32926.html

相关文章

Xcode 对应的 macOS、SDK 版本

最低要求和支持的 SDK 本表截取于 2024-05-04&#xff0c;更多更新可见&#xff1a;https://developer.apple.com/cn/support/xcode/ Xcode 版本要求的最低 OS 版本SDK架构部署目标模拟器SwiftXcode 15.3macOS Sonoma 14iOS 17.4 macOS 14.4 tvOS 17.4 watchOS 10.4 DriverKi…

初识C语言——第九天

ASCII定义 在 C 语言中&#xff0c;每个字符都对应一个 ASCII 码。ASCII 码是一个字符集&#xff0c;它定义了许多常用的字符对应的数字编码。这些编码可以表示为整数&#xff0c;也可以表示为字符类型。在 C 语言中&#xff0c;字符类型被定义为一个整数类型&#xff0c;它占…

EXCEL怎样把筛选后含有公式的数据,复制粘贴到同一行的其它列?

自excel2003版之后&#xff0c;常规情况下&#xff0c;复制筛选后的数据&#xff0c;会忽略隐藏行&#xff0c;仅复制其筛选后的数据&#xff0c;粘贴则是粘贴到连续单元格区域&#xff0c;不管行是在显示状态还是隐藏状态。 一、初始数据&#xff1a; 二、题主的复制粘贴问题…

使用OpenCV实现图像平移

使用OpenCV实现图像平移 程序流程效果代码 程序流程 读取图像并获取其高度、宽度和通道数。定义平移量tx和ty&#xff0c;并创建平移矩阵M。使用cv2.warpAffine函数对图像进行仿射变换&#xff08;平移&#xff09;&#xff0c;得到平移后的图像。显示平移后的图像。等待用户按…

智慧文旅开启沉浸式文化体验,科技让旅行更生动:借助智慧技术,打造沉浸式文化体验场景,让旅行者在旅行中深度感受文化的魅力

一、引言 随着科技的飞速发展&#xff0c;传统旅游行业正经历着前所未有的变革。智慧文旅&#xff0c;作为一种新兴的旅游模式&#xff0c;正以其独特的魅力&#xff0c;吸引着越来越多的旅行者。智慧文旅不仅改变了人们的旅行方式&#xff0c;更在深度上丰富了人们的文化体验…

QT, 查看局域网内在线主机的mac地址

如题&#xff0c; QProcess 通过 调用 windows 系统 arp.exe 并解析其获取的数据&#xff0c;得到其mac地址&#xff0c;关键代码如下(从项目中摘取&#xff0c;放心使用)&#xff1a; //arp for mac;m_process->start("c:/windows/system32/arp.exe -a "ipAddre…

【网络安全产品】---应用防火墙(WAF)

what Web应用防火墙&#xff08;Web Application Firewall) WAF可对网站或者App的业务流量进行恶意特征识别及防护&#xff0c;在对流量清洗和过滤后&#xff0c;将正常、安全的流量返回给服务器&#xff0c;避免网站服务器被恶意入侵导致性能异常等问题&#xff0c;从而保障…

【webrtc】RemoteAudioSource的创建线程

m98 代码&#xff1a;I:\webrtc m98_yjf\src\pc\rtp_transmission_manager.cc RtpTransmissionManager::CreateReceiver 在信令线程创建receiver receiver 是&#xff1a; rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>receiver;其实际…

音视频开发之旅——实现录音器、音频格式转换器和播放器(PCM文件转换为WAV文件、使用LAME编码MP3文件)(Android)

本文主要讲解的是实现录音器、音频转换器和播放器&#xff0c;在实现过程中需要把PCM文件转换为WAV文件&#xff0c;同时需要使用上一篇文章交叉编译出来的LAME库编码MP3文件。本文基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo Android系列&am…

GDPU unity游戏开发 碰撞器与触发器

砰砰叫&#xff0c;谁动了她的奶酪让你的小鹿乱撞了。基于此&#xff0c;亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲&#xff0c;碰撞器检测碰撞&#xff0c;触发器检测触发&#xff0c;讲了跟没讲似的。碰撞器是用来检测碰撞事件的&#xff0c;在unity中&#xff…

使用Pytorch中的torchtext加载和预处理文本分类任务的数据集

文章目录 1. torchtext版本&#xff1a;0.15.02. 导入库和模块&#xff1a;3. 定义分词器&#xff1a;3.1 一个简单的示例来进一步说明 get_tokenizer 函数的使用 4. 下载并加载数据集5. 定义词汇表并构建5.1 map() 函数一个简单的map() 函数的例子 5.2 torchtext.vocab.build_…

浅谈ps/2键盘

文章目录 说明基础知识操作系统中断类型工作机制优点应用 CPU对IO设备的轮询机制轮询机制的工作原理轮询机制的特点轮询机制的优、缺点与中断机制的对比 N-Key Roller&#xff08;全键无冲&#xff09;应用领域实现原理技术限制 PS/2接口简介USB设备&PS/2设备的工作机制PS/…

【强训笔记】day8

NO.3 思路&#xff1a;相乘除以最大公约数等于最小公倍数。最小公倍数等于gcd&#xff08;a&#xff0c;a%b&#xff09;递归直到b等于0。 代码实现&#xff1a; #include <iostream> using namespace std;int gcd(int a,int b) {if(b0) return a;return gcd(b,a%b); }…

深入学习Redis(1):Redis内存模型

Redis的五个对象类型 字符串&#xff0c;哈希&#xff0c;列表&#xff0c;集合&#xff0c;有序集合 本节有关redis的内存模型 1.估算redis的内存使用情况 目前内存的价格比较的高&#xff0c;如果对于redis的内存使用情况能够进行计算&#xff0c;就可以选用合适的设备进…

组合总和2(力扣40)

解题思路&#xff1a;因为这里不能有重复的组合&#xff0c;所以采取用下表used来判断其是否在前面出现过&#xff0c;如果出现过就直接跳过&#xff0c;同时判断是树层重复还是树枝重复&#xff0c;如果是树枝重复就不用跳过 具体代码如下&#xff1a; class Solution { pu…

Leetcode—1056. 易混淆数【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—1056. 易混淆数 &#x1f4a9;山实现代码 class Solution { public:bool confusingNumber(int n) {int arr[10] {0};int notNum 0;int arr2[12] {0};int size 0;while(n) {int x n % 10;arr[x] 1;arr2[size] x;if(…

【一刷《剑指Offer》】面试题 12:打印 1 到最大的 n 位数

力扣对应题目链接&#xff1a;LCR 135. 报数 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;打印从1到最大的n位数_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》内容 二、分析题目 1、暴力解法 2、用字符串模拟数字加法 首先要考虑当 n 很大时&…

IoTDB 入门教程 基础篇⑦——数据库管理工具 | DBeaver 连接 IoTDB

文章目录 一、前文二、下载iotdb-jdbc三、安装DBeaver3.1 DBeaver 下载3.2 DBeaver 安装 四、安装驱动五、连接数据库六、参考 一、前文 IoTDB入门教程——导读 二、下载iotdb-jdbc 下载地址org/apache/iotdb/iotdb-jdbc&#xff1a;https://maven.proxy.ustclug.org/maven2/o…

【数学建模】矩阵微分方程

一、说明 我相信你们中的许多人都熟悉微分方程&#xff0c;或者至少知道它们。微分方程是数学中最重要的概念之一&#xff0c;也许最著名的微分方程是布莱克-斯科尔斯方程&#xff0c;它控制着任何股票价格。 ​​ 股票价格的布莱克-斯科尔斯模型 微分方程可以由数学中的许多…

MyBatisPlus @TableLogic实现全局自动逻辑删除

一、背景 有一天&#xff0c;小王在编写代码时实现了一个删除操作&#xff0c;但由于测试场景覆盖不全&#xff0c;上线后不慎删除了系统中的部分业务数据。幸运的是&#xff0c;系统已经开启了binlog日志功能&#xff0c;使得我们能够根据日志来恢复这些误删的数据。这一事故…