zoukankan      html  css  js  c++  java
  • 什么是数组存储结构?线性存储结构的顺序存储该怎么操作!

    一、从数据结构的角度讲解数组存储结构

    所讲的数组,要将其视为一种存储结构,与平时使用的数组基本数据类型区分开。

    一说起数组,我们的印象中数组往往是某一门编程语言中包含的具体数据类型,其实不然。

    从本质上讲,数组与顺序表、链表、栈和队列一样,都用来存储具有 "一对一" 逻辑关系数据的线性存储结构。只因各编程语言都默认将数组作为基本数据类型,使初学者对数组有了 "只是基本数据类型,不是存储结构" 的误解。

    不仅如此,数组和其他线性存储结构不同,顺序表、链表、栈和队列存储的都是不可再分的数据元素(如数字 5、字符 'a' 等),而数组既可以用来存储不可再分的数据元素,也可以用来存储像顺序表、链表这样的数据结构。

    比如说,数组可以直接存储多个顺序表。我们知道,顺序表的底层实现还是数组,因此等价于数组中继续存储数组。这与平时使用的二维数组类似。

    根据数组中存储数据之间逻辑结构的不同,数组可细分为一维数组、二维数组、...、n 维数组:

        ▷ 一维数组,指的是存储不可再分数据元素的数组,如下图所示:


     

        ▷ 二维数组,指的存储一维数组的一维数组,如下图所示:


     

        ▷ n 维数组,指的是存储 n-1 维数组的一维数组;

    注意,无论数组的维数是多少,数组中的数据类型都必须一致。

    由此,我们可以得出这样一个结论,一维数组结构是线性表的基本表现形式,而 n 维数组可理解为是对线性存储结构的一种扩展。

    二、数组的顺序存储(C语言版)

    数组作为一种线性存储结构,对存储的数据通常只做查找和修改操作,因此数组结构的实现使用的是顺序存储结构。

    要知道,对数组中存储的数据做插入和删除操作,算法的效率是很差的。

    由于数组可以是多维的,而顺序存储结构是一维的,因此数组中数据的存储要制定一个先后次序。通常,数组中数据的存储有两种先后存储方式:

        1、以列序为主(先列后行):按照行号从小到大的顺序,依次存储每一列的元素

        2、以行序为主(先行后序):按照列号从小到大的顺序,依次存储每一行的元素。

    多维数组中,我们最常用的是二维数组。比如说,当二维数组 a[6][6] 按照列序为主的次序顺序存储时,数组在内存中的存储状态如下图所示:


     

    同样,当二维数组 a[6][6] 按照行序为主的次序顺序存储时,数组在内存中的存储状态,如下图所示:


     

    C 语言中,多维数组的存储采用的是以行序为主的顺序存储方式。

    通过以上内容,我们掌握了将多维数组存储在一维内存空间的方法。那么,后期如何对指定的数据进行查找和修改操作呢?

    多维数组查找指定元素

    当需要在顺序存储的多维数组中查找某个指定元素时,需知道以下信息:

        ✪ 多维数组的存储方式;

        ✪ 多维数组在内存中存放的起始地址;

        ✪ 该指定元素在原多维数组的坐标(比如说,二维数组中是通过行标和列标来表明数据元素的具体位置的);

        ✪ 数组中数组的具体类型,即数组中单个数据元素所占内存的大小,通常用字母 L 表示。

    根据存储方式的不同,查找目标元素的方式也不同。如果二维数组采用以行序为主的方式,则在二维数组 anm中查找 aij存放位置的公式为:

    LOC(i,j) = LOC(0,0) + (i*m + j) * L;

    其中,LOC(i,j) 为 aij在内存中的地址,LOC(0,0) 为二维数组在内存中存放的起始位置(也就是 a00的位置)。

    而如果采用以列存储的方式,在 anm中查找 aij的方式为:

    LOC(i,j) = LOC(0,0) + (i*n + j) * L;


     

    最后,不管你是转行也好,初学也罢,进阶也可,如果你想学编程~

    【值得关注】我的 C/C++编程学习交流俱乐部 【点击进入】

    问题答疑,学习交流,技术探讨,还有超多编程资源大全,零基础的视频也超棒~

  • 相关阅读:
    求求你规范下你的代码风格
    为啥用ip不可以访问知乎,而百度却可以?
    漫画:htts是如何保证一台主机把数据安全发给另一台主机
    如何从亿量级中判断一个数是否存在?
    广播路由算法 :我是如何优雅着把悄悄话带给其他人的
    什么?你不知道0.0.0.0和255.255.255.255这两个地址是干嘛的?
    一篇文章带你学会Linux三剑客之一:awk
    你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?
    通俗易懂讲解TCP流量控制机制,了解一下
    一文读懂拥塞控制
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14384938.html
Copyright © 2011-2022 走看看