版权声明
本文原创作者:wby小菜盒
作者博客地址:https://blog.csdn.net/weixin_51037598/
文章目录
程序设计导引(二)
数据结构基础教程
上承:程序设计导引(一)
基本的数据结构
- 逻辑结构分为三种线性结构、图形结构、树形结构,其中线性结构的存储结构(即线性表在内存中的体现形式)有数组(顺序存储)与链表(链式存储)
- 逻辑结构:客体在自然环境下的状态,与计算机无关
- 存储结构:存储于计算机内存中的结构,算法基于存储结构(wby暴力解释)【存储时需注意:存储的不仅有数据元素还有他们之间的关系】
- 用途:必要时可以自己封装程序—>引入概念:数据类型
- 数据类型(Data Type):
(1)确定数据类型后即可确定:
• 分得多大空间
• 表示多大范围
• 能做何种运算
(2)两种数据类型:
- 通用、基本的数据类型:数值类型(整型浮点型)、布尔型类型、字符串类型
- 自定义数据类型(即C中的结构体)
可将多种基本数据类型(数据项)组合为一个数据元素,在内存中以第一个数据地址(即起始地址)代表该元素的地址。【因:数据元素里的每一个数据项是连续且递增的】
全体的数据元素称为数据对象;更大:整体数据集
线性结构(1:1)(基本上=>线性表)
线性表(数组、链表)、栈、队列、串。其中栈与队列为操作受限的线性表
线性表(最常用且最简单的一种数据结构)
- 特点(逻辑结构):四个唯一:
- 存在唯一被称为“第一个”的数据元素
- 存在唯一被称为“最后一个”的数据元素
- 除第一个元素以外,所有的数据元素均只有一个‘前驱’
- 除最后一个元素外,所以的数据元素均只有一个‘后继’
- 应用:花名册,关系型数据库等等
线性表的存储结构(或称为物理结构)(数组与链表)
- 认识基本操作:
- 遍历:对每一个元素进行访问并只访问(print)一次
- 插入
- 删除
- 顺序存储结构(一维数组)
(注:上图中“在内存中的地址”为方便起见,自定义为了十进制,但实际上,真正在计算机内部,地址用二进制表示)
- 概念:用一组地址连续的存储单元(字节为最小的存储单元)(存储单元的唯一标识:地址)依次存放(即存放空间连续)(实现了用物理存储位置体现逻辑关系,无需指针)线性结构中的数据元素【实际计算机工作时:由数据线先从内存中读取数据,后将数据传递给地址线】
- 核心:用物理存储位置的关系体现逻辑关系
所有元素都是同一种数据类型,一个元素代表一个(或多个)字节,所有元素必须连续存放(字节相连)。 - 操作原理:确定数据类型后即可确定:
• 分得多大空间
• 表示多大范围
• 能做何种运算
例: * int型:4B(字节)
* 字符型:1B(字符即a,b,A之类)
因 为顺序结构–>知道第一个数据元素的起始地址
–>知道该元素是第几个元素
–>知道其数据类型(int/字符串型/其他)
便可确定该元素的地址
- 优缺点
(1)优点:随机存取、查找方便、节省存储空间
(2)缺点:一般插入、删除需移动(多次赋值变量实现)元素位置(除末尾)——>插入1:移动时遵循后面先动原则,删除则相反
- 遍历的实现:
用下标(=>索引)按照上述操作原理,从头–>尾
注:下标=>索引,但不能画等号,因:下标仅为正数值,而索引正负皆可(正、逆索引)
- 链式存储(分单向、双向链表、循环链表多种,下面仅详细说明单向链表)(链表=>python中的列表)
注:链表=>python,但不能画等号,因:数据类型----链表中的数据项数据类型一点相同,但列表则可不同(其可包含数值型、字符串型、字典、元组、甚至是列表);列表是python封装好的,但其性能非最佳。
- 几个概念:重点是将以下几个概念连接起来,了解结点的结构
(1)结点:数据域2(前)+指针3域4(后)(如上图中的A、B、P、T)【注:数据域与指针域空间必连续】
(2)首元结点(如上图A)怎么找到?
①头指针:仅存放首元结点的指针域
☆②头结点(比较常用):存放首元结点的位置(有数据域和指针域,但数据域为空[如上图中红色背景区域])【引入目的:方便程序员的操作,减少程序员写代码的复杂度】
(3)“^”空指针域
即null(表尾常用到,即:最后一个元素地址域为空)
(4)单链表两种形式(如上图所示)
①第一个为存放完整的链表
②第二个为空链表----代码表示:
if head==null:
print(“这是一个空链表”) - 核心:用指针域显示的体现逻辑关系
操作受限的线性表
栈与队列
栈
顺序栈、链栈
- 逻辑特性:后进先出(LIFO结构)(出入个数不管)【注:不可说成 先进后出!!】(类似糖葫芦)
- 定义:操作受限的线性表(满足四个唯一)
操作受限:限定在表尾进行插入或删除操作
【注:出栈顺序与入栈顺序不一定相同】 - 应用
- 十进制转二进制:除二取余,倒取余数
- 函数:后调用的先返回
- 输入法:增删改
- 存储:顺序栈、链栈----栈顶指针;栈底指针
队列
循环队列、链队列
- 逻辑特性:先进先出(FIFO结构)
- 定义:操作受限的线性表(同上)
操作受限:只能在表头删除,表尾插入
【注:入栈顺序与出栈顺序一定相同】 - 应用
- 软件在CPU中运行(就绪队列的调度算法:先来先服务算法FCFS)
- 打印机(排队)
- 存储:链式存储----队头指针(front);队尾指针(rear)
概念:假溢出----删一个其空间可循环利用
树形结构(1:n)
- 本质:递归
- 认识几个概念:
- 双亲(仅一个前驱)、祖先(符合自然伦理认知:家族谱)
- 左右孩子、兄弟、堂兄弟(符合自然伦理认知)
- 根节点(图中A或1)、叶子结点(无直接后继的结点)
- 深度:树有几层
- 特点:除了根节点后的其他结点 组成了若干互不相交的子树
- 特例:二叉树
- 定义:每个节点max2个树(2个分支:左、右支)
- 关系:显示地左右指针
- 特殊:满二叉树:左右指针全满
n层有2^n-1个结点 - 完全二叉树:标号位置同
min:2^(n-1)
max:2^n-1满二叉树
- 应用:解压缩文件(哈夫曼)
- 存储:补成完全二叉树后存储或遍历;二叉链表:左孩子|数据|右孩子
- 遍历方式:非完全二叉树与完全二叉树分别的遍历方式
图形结构(n:m)
- 几个概念:
- 顶点(也有数据):v1,v2,v3……
- 边(双行道“——”)【无向图】;弧(单行道“——>”)【有向图】;关系图中仅出现边或弧
- 边或弧上的值:权值(或叫代价time or cost or distance)
- 边的数目:度
- 弧①出度:–>
②入度:<–
度数=出度数+入度数 - 带权值的图叫网(无向网或有向网)(上图中下方的两图)
- 存储
顺序不能存,链式存储 - 应用
- 最小生成树算法
- 最短路径问题(电信公司或银行或景区酒店的选址)
- 图的遍历
总述见:程序设计导引【总述】