数组的定义及实现

文章目录

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


前言

  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.xdnf.cn/news/1410975.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

21世纪世界最具影响力的华人颜廷利:乱与净之中的汉字智慧

人类离不开‘卵’字&#xff0c; 众生离不开‘乱’&#xff08;与‘卵’同音&#xff09;字&#xff1b; 生命离不开‘精’字&#xff0c; 升命离不开‘净’&#xff08;与‘精’同音&#xff09;字…&#xff08;升命学说&#xff09; 21世纪东方哲学家思想家、科学家、当代中…

量化研究---pywencai问财数据的使用,提供源代码

文章链接 量化研究---pywencai问财数据的使用,提供源代码 (qq.com) pywencai是一个强大的第三方库库&#xff0c;开源的源代码&#xff0c;但是教程比较少&#xff0c;我简单的写一个教程结合我的使用&#xff0c;也开源直接访问我网页 网页http://120.78.132.143:8023/wencai…

Unity开发微信小游戏(2)分享

目录 1.概述 2.代码 3.示例 4.个人作品 1.概述 这里我们能做有两件事&#xff1a; 1&#xff09;主动发起分享 2&#xff09;监听右上角分享&#xff08;...按钮&#xff0c;发朋友圈也在这里&#xff09; API&#xff1a;官方文档 2.代码 1&#xff09;主动发起分享&…

数据结构与算法-单向环形链表与约瑟夫问题

1.简介 单向环形链表&#xff0c;闭合的形成一个环。 单向环形链表的一个应用场景是约瑟夫问题。 约瑟夫问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;…&#xff0c;n的n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人…

ESP32 烧录固件

第一步&#xff1a;下载固件 git clone --recursive https://github.com/espressif/esp-at.git 第二步&#xff1a;执行编译 在该目录执行 python build.py install 如图&#xff1a; 第三步&#xff1a;选择芯片 输入2 第四步&#xff1a;选择固件 输入1 第五步&#…

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议&#xff0c;建立在FTP协议之上 2.http请求 3.http响应 请求响应报文参考&#xff1a;https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…

分布式事务—> seata

分布式事务之Seata 一、什么是分布式事务&#xff1f; 分布式事务是一种特殊类型的事务&#xff0c;它涉及多个分布式系统中的节点&#xff0c;包括事务的参与者、支持事务的服务器、资源服务器以及事务管理器。 在分布式事务中&#xff0c;一次大型操作通常由多个小操作组成…

【UnityRPG游戏制作】NPC交互逻辑、动玩法

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

git学习指南

文章目录 一.版本控制1.认识版本控制2.版本控制功能3.集中式版本控制4.分布式版本控制 二.Git的环境安装搭建1.Git的安装2.Git配置分类3.Git配置选项 三.Git初始化本地仓库1. git init/git clone-获取Git仓库2. 本地仓库文件的划分3. git status-检测文件的状态4. git add-文件…

[XYCTF新生赛]-PWN:fmt解析(scanf格式化字符串漏洞,任意地址写)

查看保护 查看ida 这里没什么好说的 完整exp&#xff1a; from pwn import* context(log_leveldebug) #pprocess(./fmt) premote(gz.imxbt.cn,20975) backdoor0x4012BEp.recvuntil(bgift: ) printf_addrint(p.recv(14),16) print(hex(printf_addr)) libcELF(./libc-2.31.so) …

java 学习二

java字面量 java变量 注意事项 十进制转二进制 计算机中表示数据的最小单元 java中的数据类型 java中的类型转换 表达式的自动类型转换 强制类型转换

大气官网(1):家居家电,海量案例来袭。

设计一款大气的家居家电官网&#xff0c;可以考虑以下几个方面&#xff1a; 色彩选择&#xff1a;选择适合家居家电风格的色彩搭配。可以选择温暖的中性色调&#xff0c;如米白色、灰色和棕色&#xff0c;以增加页面的大气感和舒适感。图片展示&#xff1a;使用高质量的图片展…

一加12/11/10/Ace2/Ace3手机上锁回锁BL无限重启黑屏9008模式救砖

一加12/11/10/Ace2/Ace3手机官方都支持解锁BL&#xff0c;搞机的用户也比较多&#xff0c;相对于其他品牌来说&#xff0c;并没有做出限制&#xff0c;这也可能是搞机党最后的救命稻草。而厌倦了root搞机的用户&#xff0c;就习惯性回锁BL&#xff0c;希望彻底变回官方原来的样…

Redis__三大日志

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__三大日志 ⏱️ 创作时间&#xff1a;2024年04月30日 ———————————————— 对于MySQL来说, 有…

39 死锁

目录 1.死锁 2.线程同步 3.条件变量 4.案例 死锁 概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 四个必要条件 互斥条件&#xff1a;一个资源每次只能被一个执行流使用 请求…

LeetCode题练习与总结:柱状图中最大的矩形--84

一、题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a…

硬盘选购指南

转载请注明出处&#xff01; author karrysmile date 2024年5月3日19:10:52 结论 先给用途分类和价格表 前置知识 没有不好的品牌&#xff0c;只有不好的系列。不用认准哪个品牌就不好&#xff0c;认准口碑好&#xff0c;稳定性好的系列买。&#xff08;杂牌别买&#xff0…

82、动态规划-杨辉三角

思路&#xff1a; 本题其实很容易看出来&#xff0c;首尾都是1&#xff0c;然后第2个元素就是上一行的第一个元素和第二个元素之和。依次类推。可以得出结论&#xff1a;dp[i][j]dp[i-1][j-1]dp[i-1][j],当然要去掉首尾元素。代码如下&#xff1a; public static List<List&…

AtCoder Beginner Contest 351 C题

C - Merge the balls Time Limit: 2 sec / Memory Limit: 1024 MB Score 250 points Problem Statement You have an empty sequence and &#x1d441;N balls. The size of the &#x1d456;i-th ball (1≤&#x1d456;≤&#x1d441;) is ​2^A[i] You will perform…

内网安全-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线简单总结

我这里只记录原理&#xff0c;具体操作看文章后半段或者这篇文章内网渗透—代理Socks协议、路由不出网、后渗透通讯、CS-MSF控制上线_内网渗透 代理-CSDN博客 注意这里是解决后渗透通讯问题&#xff0c;之后怎么提权&#xff0c;控制后面再说 背景 只有win7有网&#xff0c;其…