数组和广义表

  • 数组
      • 数组定义
        • 特点
          • 常见运算及声明方式
          • 数组的顺序表示和实现
      • 矩阵的压缩存储
        • 概念
        • 稀疏矩阵
        • 对称矩阵
        • 三角矩阵
    • 广义表

数组

数组定义

数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。(数组下标也相当于指针,用于指出元素在数组的地址)数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组

例如 m × n m \times n m×n 的一个二维数组(m>=1&&n>=1):

特点

  • 数组是相同数据类型元素的集合
  • 数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起(元素之间地址连续)
常见运算及声明方式
  • 常见运算:
    给定数组下标,读写相应元素
  • C语言中声明方式:
    数据类型 数组名 [第一维长度][第二维长度]……[第n维长度]
    例:二维数组 int a[20][60];
数组的顺序表示和实现
  • 一维数组
    以int a[17]为例:
    令a[0]的存放地址为Loc(0),每个元素的所占的存储空间为k个空间,那么怎么计算数组中任意一个元素a[i]的存储地址呢?我们来找找规律。

    从上可以很容易得出Loc(i)=Loc(0)+i*k
  • 二维数组
    二维数组有两种方式将数组元素存储,以列主序,行主序进行存储。
    以行主序存储,即是将二维数组中的元素以一行为批次进行存储,如下图:

    从图可以·很容易得出以行主序存储时,任意元素在数组中的位置,假设首元素a11地址为Loc(0),每个元素占k个空间,则任意元素位置:Loc(i,j)=Loc(1,1)+[(i-1)*n+(j-1)]*k
    (ps:这里下标是从1开始的,如果下标从0开始那么i就减0,其实原理就是把目标位置前面的元素占了多少位置算出来)
    以列主序存储,即是以二维数组的一列为批次进行存储,如下图:

    此时我们算任意元素的位置时,就要把它前面列的所有元素所占空间算出来,再加上目标元素上方元素的空间,即可算出这个元素的位置:Loc(i,j)=Loc(1,1)+[(j-1)*m+(i-1)]*k

矩阵的压缩存储

概念

  • 若多个数据元素的值都相同,则只分配一个元素的存储空间,且零元素不占存储空间,这就是压缩存储
  • 一些特殊矩阵,如对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等矩阵可以进行压缩

稀疏矩阵

  • 概念:矩阵中非零元素较少(一般小于5%)的矩阵,非0元比0元少,分布无规律的矩阵
  • 压缩:存储行列维数,非0元行列下标及其值
  • 矩阵稀疏程度的表示:稀疏因子δ
  • δ = δ= δ=t/( m × m× m×n), m × m× m×n矩阵中有t个元素不为0

对称矩阵

  • 概念:顾名思义,即是以矩阵的对角线为轴,两边元素对称的矩阵
    如图,上下两边颜色相同的元素,值也相同

在对称矩阵中,出现一半重复元素,所以我们只需要存一般的元素即可,存上三角或者下三角都是可以的,节省空间。
在存储时,我们采用行主序存储,先一行一行的存,即:a11,a21,a22,……an1,an2……ann


则矩阵元素a[i,j]在一维数组中的元素下标:

i>=j时:
第一行一个元素,第二行两个元素,第i行i个元素,所以前i行元素个数是:(i-1)*i/2,而第i行第j个元素前面有j-1个元素,一维数组下标从0开始。

三角矩阵

下三角矩阵

在三角矩阵中,0元素不占空间,所以只需存储非0元素的下三角,其存储用行主序存储,如图:

三角矩阵元素a[i][j]对应的一维数组下标:

但如果说这个三角矩阵的上三角不是0,而是非0常数c,那三角矩阵元素a[i][j]对应的一维数组下标是多少呢?
在这种情况下,我们将常数c存在数组末尾,由于我们上三角这些元素都相同,所以我们就给它一个空间去存,此时它的下标就是n(n+1)/2


上三角矩阵

以列主序存储,则:

矩阵元素a[i][j]对应的一维数组下标:

非0元素i<=j时,第一行n个元素,第二行n-1个数,第i行n-i+1,前i行元素有(i-1)*(2n-i+2)/2个,在第j个元素前有j-i个元素:

当下三角元素非0,而是常数c时:

其对应的一维数组下标为(与上同理):

广义表

概念:
由n(n>=0)个元素组成的有限序列

  • 广义表存储的单个元素为原子,存储的广义表称为子表
  • LS=(a1,a2,a3……,an),其中a1是原子项,或者是一个广义表,LS是广义表的名字n为它的长度,若a1为广义表,则称为LS的子表。
  • 若广义表非空,则:
    a1表中第一个元素称为表头
    其余元素组成的子表称为表尾
    广义表中所包含元素(包括原子和子表)的个数称为表的长度
    广义表中括号的最大层数称为表深度(表的层数就是去数有多少个括号)
    如图:

    特点:
  • 广义表的元素可以是原子,可以是子表,子表的元素又可以是子表
  • 广义表本身可以是一个递归表
  • 根据对表头表尾的定义,任何一个非空广义表的表头可以是原子,也可以是子表,而表尾必定是广义表

今日的分享就到这里了,如有错误,敬请指正,祝大家学习愉快

C语言数据结构学习——数组和广义表相关推荐

  1. 数据结构05数组和广义表

    第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展:表中的数据元素本身也是一个数据结构. 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束,每个元素都有一个直接后继元素 ...

  2. 数据结构之数组与广义表

    目录 联系 数组 广义表 联系 数组和广义表可看作一种扩展的线性数据结构,其特殊性在于数据元素的构成上.从组成线性表的元素角度看,数组是由具有某种结构的数据元素构成,广义表则是由单个元素或子表构成的. ...

  3. 数据结构:数组和广义表

    数组 数组这部分内容在写<线性表>的的时候介绍过,所以这里就略过一部分内容(略过的内容在这里),写一写前边没写过的. 由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和 ...

  4. 六、考研数据结构笔记——数组与广义表

    一.数组的定义 一维数组:就是线性表,前面有 二维数组:准备考研的应该都知道,就是一个矩阵. 数组一旦被定义其,维数(行)和维界(列)就不能改变.只会读取加修改元素. 二.二维数组的按行(列)优先 事 ...

  5. 【数据结构】数组和广义表

    感觉数组这一段没讲什么太多的东西. 先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外.操作只有初始化 销毁 取元素 修改元素.然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 ...

  6. 数据结构 习题 第五章 多维数组和广义表 (C语言描述)

    最近在复习数据结构,所以想把平时上课做的习题做个总结,如果大家有遇到这方面的问题就可以参考一下了,废话不多说,直接开始吧. 1.单选题 稀疏矩阵一般的压缩存储方法有两种,即( D) A. 二维数组和三 ...

  7. 数据结构(C语言第2版) 课后习题答案之第四章 串、数组和广义表

    目录 第4章  串.数组和广义表 1.选择题 (1)串是一种特殊的线性表,其特殊性体现在(  ). (2)串下面关于串的的叙述中,(  )是不正确的? (3)串"ababaaababaa&q ...

  8. 数组和广义表 - [数据结构]

    2005-09-07 数组和广义表 - [数据结构] 第五章 数组和广义表 --非线性数据结构 5.1 数组的定义和运算 ☆二维数组的逻辑结构形式定义为: 2_Array=( D, R ) 其中 D= ...

  9. 数据结构数组计算机中的应用,2018考研计算机:数据结构数组和广义表复习重点...

    2018考研计算机:数据结构数组和广义表复习重点 2017-08-17 16:00 | 考研集训营 <数据结构(C语言版)>复习重点在二.三.六.七.九.十章,考试内容两大类:概念,算法, ...

最新文章

  1. iOS 4.2 SDK安装
  2. Is It A Tree?
  3. 一文读懂计算计仿真技术
  4. 第三十章 elk(1) - 第一种架构(最简架构)
  5. BaiDu校招2016计算机视觉笔试试题
  6. android 锁屏音量,Android锁屏状态获取音量按键事件
  7. 使用工具快速找出custom work center使用的ui component
  8. Java EE重新审视设计模式:异步
  9. java remove map_Java HashMap remove()方法
  10. Redis 6.0 源码阅读笔记(9) -- 数据淘汰原理
  11. DG - 开启Active Data Guard
  12. 显卡坏,导致机器无法启动
  13. nginx静态资源服务器(一)
  14. dataset.padded_batch 用法案例
  15. 实用命令-pv: 管道查看器
  16. Leaf-美团分布式ID生成服务
  17. 如何修改网卡的默认dns服务器,DNS怎么设置?DNS设置大全
  18. 电机学他励直流发电机matlab,华南理工电机学随堂练习答案完整版
  19. Power BI Dax 之时间智能函数
  20. [附源码]java毕业设计哈金院食堂美食评价系统

热门文章

  1. 关于switch-case的用法细节及其特殊用法
  2. java打包并下载压缩包报错问题
  3. 发json请求,报415错误。POST http://localhost:8080/ 415
  4. 案例分析:回归-克里金方法生成气温表面图(1)
  5. Matlab基本函数-floor函数
  6. 利用xposed自动获得支付宝个人收款二维码链接和收款记录
  7. 记一次在K8s集群搭建的MySQL主从无法正常启动之数据迁移恢复实践
  8. 设置EditText输入的文字全部变成大写或小写
  9. 【量化笔记】ARCH效应检验及GARCH建模的python实现
  10. SpringMVC的 transferTo使用