程序设计导引(二)

版权声明
本文原创作者:wby小菜盒
作者博客地址:https://blog.csdn.net/weixin_51037598/

程序设计导引(二)

数据结构基础教程

上承:程序设计导引(一)

基本的数据结构

例图1

  1. 逻辑结构分为三种线性结构、图形结构、树形结构,其中线性结构的存储结构(即线性表在内存中的体现形式)有数组(顺序存储)链表(链式存储)
  • 逻辑结构:客体在自然环境下的状态,与计算机无关
  • 存储结构:存储于计算机内存中的结构,算法基于存储结构(wby暴力解释)【存储时需注意:存储的不仅有数据元素还有他们之间的关系】
  1. 用途:必要时可以自己封装程序—>引入概念:数据类型
  2. 数据类型(Data Type):
    (1)确定数据类型后即可确定:
    分得多大空间
    表示多大范围
    能做何种运算
    (2)两种数据类型:
  • 通用、基本的数据类型:数值类型(整型浮点型)、布尔型类型、字符串类型
  • 自定义数据类型(即C中的结构体)
    可将多种基本数据类型数据项)组合为一个数据元素,在内存中以第一个数据地址(即起始地址代表该元素的地址。【因:数据元素里的每一个数据项是连续且递增的】
    全体的数据元素称为数据对象;更大:整体数据集

线性结构(1:1)(基本上=>线性表)

线性表(数组、链表)、栈、队列、串。其中栈与队列为操作受限的线性表

线性表(最常用且最简单的一种数据结构

例图2

  1. 特点(逻辑结构):四个唯一
  • 存在唯一被称为“第一个”的数据元素
  • 存在唯一被称为“最后一个”的数据元素
  • 除第一个元素以外,所有的数据元素均只有一个‘前驱’
  • 除最后一个元素外,所以的数据元素均只有一个‘后继’
    例图3
  1. 应用:花名册,关系型数据库等等
线性表的存储结构(或称为物理结构)(数组与链表)
  1. 认识基本操作
  • 遍历:对每一个元素进行访问并只访问(print)一次
  • 插入
  • 删除
  1. 顺序存储结构(一维数组
    例图4
    (注:上图中“在内存中的地址”为方便起见,自定义为了十进制,但实际上,真正在计算机内部,地址用二进制表示)
  • 概念:用一组地址连续存储单元(字节为最小的存储单元)(存储单元的唯一标识:地址)依次存放(即存放空间连续)(实现了用物理存储位置体现逻辑关系,无需指针)线性结构中的数据元素【实际计算机工作时:由数据线先从内存中读取数据,后将数据传递给地址线
  • 核心:用物理存储位置的关系体现逻辑关系
    所有元素都是同一种数据类型,一个元素代表一个(或多个)字节,所有元素必须连续存放(字节相连)。
  • 操作原理:确定数据类型后即可确定:
    分得多大空间
    表示多大范围
    能做何种运算
    例: * int型:4B(字节)
    * 字符型:1B(字符即a,b,A之类)
    因 为顺序结构–>知道第一个数据元素的起始地址
    –>知道该元素是第几个元素
    –>知道其数据类型(int/字符串型/其他)
    便可确定该元素的地址
  • 优缺点
    (1)优点:随机存取、查找方便、节省存储空间
    (2)缺点:一般插入、删除需移动(多次赋值变量实现)元素位置除末尾)——>插入1:移动时遵循后面先动原则,删除则相反
  • 遍历的实现:
    用下标(=>索引)按照上述操作原理,从头–>尾
    注:下标=>索引,但不能画等号,因:下标仅为正数值,而索引正负皆可(正、逆索引)
  1. 链式存储分单向、双向链表、循环链表多种,下面仅详细说明单向链表)(链表=>python中的列表)
    注:链表=>python,但不能画等号,因:数据类型----链表中的数据项数据类型一点相同,但列表则可不同(其可包含数值型、字符串型、字典、元组、甚至是列表);列表是python封装好的,但其性能非最佳。
    例图5
  • 几个概念:重点是将以下几个概念连接起来,了解结点的结构
    (1)结点:数据域2(前)+指针34(后)(如上图中的A、B、P、T)【注:数据域与指针域空间必连续】
    (2)首元结点(如上图A)怎么找到?
    ①头指针:仅存放首元结点的指针域
    ☆②头结点(比较常用):存放首元结点的位置(有数据域和指针域,但数据域为空[如上图中红色背景区域])【引入目的:方便程序员的操作,减少程序员写代码的复杂度】
    (3)“^”空指针域
    即null(表尾常用到,即:最后一个元素地址域为空)
    (4)单链表两种形式(如上图所示)
    ①第一个为存放完整的链表
    ②第二个为空链表----代码表示:
    if head==null:
    print(“这是一个空链表”)
  • 核心:用指针域显示的体现逻辑关系
  • 优缺点
    (1)优点:插入5、删除6无需移动元素
    (2)缺点:占内存大(或空间消耗大)(数据+指针---->关系显示占空间)、查找不便(需从头找)
操作受限的线性表

栈与队列

顺序栈、链栈

  1. 逻辑特性后进先出(LIFO结构)(出入个数不管)【注:不可说成 先进后出!!】(类似糖葫芦)
  2. 定义:操作受限线性表(满足四个唯一)
    操作受限:限定在表尾进行插入或删除操作
    【注:出栈顺序与入栈顺序不一定相同】
  3. 应用
  • 十进制转二进制:除二取余,倒取余数
  • 函数:后调用的先返回
  • 输入法:增删改
  1. 存储:顺序栈、链栈----栈顶指针;栈底指针
    例图7
队列

循环队列、链队列

  1. 逻辑特性先进先出(FIFO结构)
  2. 定义:操作受限线性表(同上)
    操作受限:只能在表头删除,表尾插入
    【注:入栈顺序与出栈顺序一定相同】
  3. 应用
  • 软件在CPU中运行(就绪队列的调度算法:先来先服务算法FCFS)
  • 打印机(排队)
  1. 存储:链式存储----队头指针(front);队尾指针(rear)
    概念:假溢出----删一个其空间可循环利用
    例图8

树形结构(1:n)

例图9

  1. 本质:递归
  2. 认识几个概念
  • 双亲(仅一个前驱)、祖先(符合自然伦理认知:家族谱)
  • 左右孩子、兄弟、堂兄弟(符合自然伦理认知)
  • 根节点(图中A或1)、叶子结点(无直接后继的结点)
  • 深度:树有几层
  1. 特点:除了根节点后的其他结点 组成了若干互不相交的子树
  2. 特例:二叉树
  • 定义:每个节点max2个树(2个分支:左、右支)
  • 关系:显示地左右指针
  • 特殊:满二叉树:左右指针全满
    n层有2^n-1个结点
  • 完全二叉树:标号位置同
    min:2^(n-1)
    max:2^n-1满二叉树
  1. 应用:解压缩文件(哈夫曼)
  2. 存储:补成完全二叉树后存储或遍历;二叉链表:左孩子|数据|右孩子
  3. 遍历方式:非完全二叉树与完全二叉树分别的遍历方式
    例图10

图形结构(n:m)

例图11

  1. 几个概念
  • 顶点(也有数据):v1,v2,v3……
  • 边(双行道“——”)【无向图】;弧(单行道“——>”)【有向图】;关系图中仅出现边或弧
  • 边或弧上的值:权值(或叫代价time or cost or distance)
  • 边的数目:度
  • 弧①出度:–>
    ②入度:<–
    度数=出度数+入度数
  • 带权值的图叫网(无向网或有向网)(上图中下方的两图)
  1. 存储
    顺序不能存,链式存储
  2. 应用
  • 最小生成树算法
  • 最短路径问题(电信公司或银行或景区酒店的选址)
  1. 图的遍历

总述见:程序设计导引【总述】


  1. 1.最后有个空位,向后推进。2.删除一个数据,再插入。3.移动(实际上为多次赋值操作)例:(以python为例)a[6]=a[5], a[5]=a[4], a[4]=20 ↩︎

  2. 数据域:存放数据 ↩︎

  3. 指针:①本质:后继元素的地址②用途:描述元素间关系 ↩︎

  4. 指针域【或叫后继域】:存放下一个结点的地址,以方便查找 ↩︎

  5. 插入:找一个结点(生成空间---->数据域+指针域),先把数据存下防止丢失(数据域中),再存下下一个结点的地址(指针域中)【最后一个元素地址域为空(不连续)】
    例图6 ↩︎

  6. 删除:改 删除结点 前的一个结点 的指针域 即可(一步赋值) ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值