数据结构知识

数据结构

  • 第零章 引入
    • 0.1 元素类型说明
    • 0.2 数组定义
    • 0.3 内存动态分配
    • 0.4 参数传递
    • 0.5 操作算法中用到的预定义常量和类型
    • 0.6 结构类型的比较
  • 第一章绪论
    • 1.1 数据结构的研究内容
          • ❀内容小结
    • 1.2 基本概念和术语
      • 1.2.1 数据、数据元素、数据项、数据对象
      • 1.2.2 数据结构
        • 1.2.2.1 逻辑结构
        • 1.2.2.2 存储结构
      • 1.2.3 数据类型和抽象数据类型
        • (1)数据类型
        • (2)抽象数据类型
          • ❀内容小结
    • 1.3 抽象数据类型的表示与实现
    • 1.4 算法和算法分析
      • 1.4.1 算法时间效率的度量
      • 1.4.2 时间复杂度
      • 1.4.3 空间复杂度
          • ❀内容小结
  • 第二章 线性表
    • 2.1 线性表的定义和特点
    • 2.2 案例引入+分析与实现
      • 2.2.1 一元多项式的运算
      • 2.2.2 稀疏多项式
      • 2.2.3 图书信息管理系统
          • ❀内容小结
    • 2.3 线性的类型定义
    • 2.4 线性表的顺序表示和实现
      • 2.4.1 线性表的顺序存储表示
        • (1)顺序表的定义
        • (2)顺序表的实现
          • I.静态分配
          • II.动态分配
          • ❀内容小结
      • 2.4.2 顺序表基本操作的实现
        • (1)线性表初始化
        • (2)销毁线性表
        • (3)清空线性表
        • (4)求线性表长度
        • (5)判断是否为空
        • (6)取值
        • (7)查找
          • 按位查找
          • 按值查找
        • (8)插入
        • (9)删除
          • ❀ 内容小结
    • 2.5 线性表的链式表示和实现
          • ❀内容小结
      • 2.5.1 单链表的定义和表示
        • (1)不带头结点的单链表
        • (2)带头结点的单链表
        • (3)不带头结点VS带头结点
          • ❀内容小结
      • 2.5.2 单链表基本操作的实现
        • (1)单链表初始化-带头结点
        • (2)判断链表是否空
        • (3)销毁
        • (4)清空
        • (5)求表长
        • (6)取值
        • (7)查找
          • 按位查找
          • 按值查找
        • (8)插入
          • 按位序插入-带头结点
          • 按位序插入-不带头结点
          • 指定结点的后插操作
          • 指定结点的前插操作
        • (9)删除
          • 按位序删除-带头结点
          • 指定结点的删除
        • (10)建立单链表
          • 头插法
          • 尾插法
          • ❀内容小结
      • 2.5.3 循环链表
        • (1)循环单链表
        • (2)循环双链表
          • 初始化
          • 插入
          • 删除
          • ❀内容小结
      • 2.5.4 双向链表
        • (1)结构定义
        • (2)初始化
        • (3)插入
        • (4)删除
        • (5)遍历
          • ❀内容小结
      • 2.5.5 静态链表
        • (1)定义
        • (2)基本操作
          • ❀内容小结
      • 2.5.6 单链表、循环链表、双向链表的时间效率比较
          • ❀内容小结
    • 2.6 顺序表和链表的比较
          • ❀内容小结
    • 2.7 线性表的应用
  • 第三章 栈和队列
    • 3.1 栈和队列的定义和特点
      • 3.1.1 栈的定义和特点
      • 3.1.2 队列的定义和特点
    • 3.2 案例引入+分析与实现
      • 3.3.1 栈-进制转换
      • 3.3.2 栈-括号匹配的检验
      • 3.3.3 表达式求值
      • 3.3.4 队列-舞伴问题
    • 3.3 栈的表示和操作的实现
      • 3.3.1 栈的抽象数据类型的类型定义
      • 3.3.2 顺序栈的表示和实现
      • 3.3.3 链栈的表示和实现
    • 3.4 栈与递归
    • 3.5 队列的表示和操作的实现
      • 3.5.1 队列的抽象数据类型定义
      • 3.5.2 队列的顺序表示和实现
      • 3.5.3 队列的链式表示和实现
  • 第四章 串、数组和广义表
    • 4.1 串
      • 4.1.1 串的定义
      • 4.1.2 案例引入、分析与实现
        • (1)病毒感染检测
      • 4.1.3 串的类型定义、存储结构及其运算
        • (1) BF算法
        • (2) KMP算法
    • 4.2 数组
      • 4.2.1 数组的抽象数据类型定义
      • 4.2.2 数组的顺序存储
      • 4.2.3 特殊矩阵的压缩存储
    • 4.3 广义表
  • 第五章 树和二叉树
    • 5.1 树和二叉树的定义
      • 5.1.1 树的定义
      • 5.1.2 树的基本术语
      • 5.1.3 二叉树的定义
        • (1)满二叉树
        • (2)完全二叉树
    • 5.2 案例引入、分析与实现
      • 5.2.1 数据压缩问题
      • 5.2.2 利用二叉树求解表达式的值
    • 5.3 树和二叉树的抽象数据类型定义
    • 5.4 二叉树的性质和存储结构
      • 5.4.1 性质
      • 5.4.2 存储结构
        • (1)顺序存储
        • (2)二叉链表
        • (3)三叉链表
    • 5.5 遍历二叉树和线索二叉树
      • 5.5.1 遍历二叉树
        • (1)先序遍历
        • (2)中序遍历
        • (3)后序遍历
        • (4)遍历算法的分析
        • (5)层次遍历
      • 5.5.2 二叉树遍历算法的应用
        • (1)二叉树的建立
        • (2)复制二叉树
        • (3)计算二叉树的深度
        • (4)计算结点总数
        • (5)计算叶子结点数
      • 5.5.3 线索二叉树
    • 5.6 树和森林
      • 5.6.1 树的存储结构
        • (1)双亲表示法
        • (2)孩子链表
        • (3)双亲与孩子结合
        • (4)孩子兄弟表示法
      • 5.6.2 树与二叉树的转换
      • 5.6.3 森林与二叉树的转换
      • 5.6.4 树森林的遍历
        • (1)树的遍历
        • (2)森林的遍历
    • 5.7 哈夫曼树及其应用
      • 5.7.1 哈夫曼树的基本概念
      • 5.7.2 构造哈夫曼树
      • 5.7.3 哈夫曼树构造算法的实现
        • (1)顺序存储——一维结构数组
      • 5.7.4 哈夫曼码
        • (1)设计哈夫曼编码
        • (2)哈夫曼编码的算法实现
        • (3)文件的编码和解码
  • 第六章 图
    • 6.1 图的定义和基本术语
    • 6.2 案例引入、分析与实现
      • 6.2.1 六度空间理论
    • 6.3 图的类型定义
    • 6.4 图的存储结构
      • 6.4.1 数组表示法(邻接矩阵)
        • (1)邻接矩阵的表示
        • (2)邻接矩阵的建立
        • (3)邻接矩阵的优缺点
      • 6.4.2 链式存储结构
        • (1)邻接表
        • (2)邻接多重表
        • (3)十字链表
    • 6.5 图的遍历
      • 6.5.1 深度优先遍历
      • 6.5.2 广度优先遍历
    • 6.6 图的应用
      • 6.6.1 最小生成树
        • (1)构造最小生成树MST
            • Prim算法
            • Kruskal算法
      • 6.6.2 最短路径
        • (1)Dijkstra算法.....
        • (2)Floyd算法
      • 6.6.3 拓扑排序
      • 6.6.4 关键路径
        • 求关键路径步骤
  • 第七章 查找
    • 7.1 查找的基本概念
    • 7.2 线性表的查找
      • 7.2.1 顺序查找(线性查找)
      • 7.2.2 折半查找(二分或对分查找)
      • 7.2.3 分块查找(索引顺序查找)
      • 7.2.4 线性表查找方法比较
    • 7.3 树表的查找
      • 7.3.1 二叉排序树
        • (1)二叉排序树存储结构
        • (2)查找
        • (3)插入
        • (4)生成
        • (5)删除
      • 7.3.2 平衡二叉树
    • 7.4 哈希表的查找
      • 7.4.1 散列表的基本概念
      • 7.4.2 散列函数的构造方法
        • (1)直接定址法
        • (2)除留余数法
      • 7.4.3 处理冲突的方法
        • (1)开放定址法
        • (2)链定址法
      • 7.4.4 散列表的查找
  • 第八章 排序
    • 8.1 基本概念和排序方法概述
    • 8.2 插入排序
      • 8.2.1 直接插入排序
      • 8.2.2 折半插入排序
      • 8.2.3 希尔排序
    • 8.3 交换排序
      • 8.3.1 冒泡排序
      • 8.3.2 快速排序
    • 8.4 选择排序
      • 8.4.1 简单选择排序
      • 8.4.2 堆排序
    • 8.5 归并排序
    • 8.6 基数排序
    • 8.7 外部排序
    • 8.8 各种排序的综合比较
      • 8.8.1 时间性能
      • 8.8.2 空间性能
      • 8.8.3 排序的稳定性能
      • 8.8.4 关于“排序方法的时间复杂度的下限”

本篇是关于王卓老师+王道咸鱼的数据结构学习笔记。

递归思想:依次往下调用(这个调用是调用的自身函数),调用到最后一层时得到的是最里层(即最下层)的数据,然后一层一层往上代(相当于嵌套函数),即可得到最终结果。

第零章 引入

0.1 元素类型说明

【对应2.4.1——线性表的顺序存储表示】
数据结构知识_第1张图片

ElemType是元素类型。若顺序表中存放的是ABCD,则可写为char;存放的是多项式系数,则写为float。
也可以单独提出来先定义。如typedef char ElemType;

0.2 数组定义

数据结构知识_第2张图片

  • 数组静态分配:数组的名字中存放的是数组中的首元素data[0]的地址,即此数组的基地址。
  • 数组动态分配:*data形式上是指针变量,但是它也可以表示一个数组,可以用它来存放数组中第一个元素的地址。

0.3 内存动态分配

数据结构知识_第3张图片

  • malloc()的参数要求是整数,即这个分配的这块空间的字节数。
  • MaxSize是根据需要自定义的。
  • ElemType决定了动态申请的空间怎样去划分。若是char类型,则是1字节1个空间;若是int类型,则是4字节1空间。。* 代表分配好的这个结果是一个指针。。外面的()表示强制类型转换。
  • (ElemType*)表示指向数据元素的指针。
  • L.data即获得了数组中这一大片空间的基地址。
  • free()中的参数要求是一个指针变量。

数据结构知识_第4张图片

0.4 参数传递

数据结构知识_第5张图片
数据结构知识_第6张图片

swap函数中最后m、n释放了。因此最终结果a、b并没有得到改变。

数据结构知识_第7张图片

*m改变的是其中的内容。因此a、b值互换。

数据结构知识_第8张图片

交换的是m、n的地址,对a、b没有影响。

数据结构知识_第9张图片

  • 注意sub()中b[]方括号中不可以指明大小
  • 最终结果相当于重新给a赋值。最终输出world

数据结构知识_第10张图片
数据结构知识_第11张图片

也可以理解为j是一个地址。i和j共同使用同一个空间(即地址相同)。

数据结构知识_第12张图片

对m、n操作实际上就是对a、b操作。因此最后a、b值成功互换。

数据结构知识_第13张图片

0.5 操作算法中用到的预定义常量和类型

数据结构知识_第14张图片

0.6 结构类型的比较

数据结构知识_第15张图片

第一章绪论

1.1 数据结构的研究内容

数据结构知识_第16张图片


数据结构知识_第17张图片

数据结构就是操作对象及操作对象之间的关系。

早期,计算机主要用于数值计算。

数据结构知识_第18张图片

现在,计算机越来越多地用于非数值计算。

在这里插入图片描述
数据结构知识_第19张图片
数据结构知识_第20张图片
数据结构知识_第21张图片
数据结构知识_第22张图片

❀内容小结

数据结构知识_第23张图片
数据结构知识_第24张图片

1.2 基本概念和术语

1.2.1 数据、数据元素、数据项、数据对象

数据结构知识_第25张图片

  • 数据是计算机程序加工的原料。
  • 数值型数据通常是指可以加减乘除、平方开方等的算数运算的。
  • 对于非数值型问题,通常会关心 每个个体的具体信息 以及 每个个体之间的关系。

数据结构知识_第26张图片
数据结构知识_第27张图片
数据结构知识_第28张图片
数据结构知识_第29张图片

1.2.2 数据结构

数据结构知识_第30张图片

  • 同一个数据对象里的数据元素,可以组成不同的数据结构。
  • 不同的数据元素,可以组成相同的数据结构。

数据结构知识_第31张图片
数据结构知识_第32张图片

数据结构知识_第33张图片

1.2.2.1 逻辑结构

数据结构知识_第34张图片
数据结构知识_第35张图片

1.2.2.2 存储结构

数据结构知识_第36张图片
数据结构知识_第37张图片


数据结构知识_第38张图片

例中字符串数组是有先后顺序的。(此顺序用内存中的存储位置来表示——在前面的元素存储时存在前面,即按照元素的位置存储)

数据结构知识_第39张图片

指针即地址。

数据结构知识_第40张图片
数据结构知识_第41张图片

通讯录便是常见的索引存储结构。

数据结构知识_第42张图片

可与《查找》一章联系学习。

1.2.3 数据类型和抽象数据类型

(1)数据类型

数据结构知识_第43张图片
数据结构知识_第44张图片
数据结构知识_第45张图片
数据结构知识_第46张图片

(2)抽象数据类型

数据结构知识_第47张图片

定义一个ADT,就是在“定义”一种数据结构。
【确定了ADT的存储结构,才能“实现”这种数据结构】

数据结构知识_第48张图片
数据结构知识_第49张图片
数据结构知识_第50张图片

基本操作名(参数表):

  • 如求圆的面积,其中半径为r。则记为 area® 。。【这种便是赋值参数】
  • 如求乘方,x的y次方。则记为power(x,y)
  • 如对一个图像G进行放大n倍的操作。则记为scale(&G,n)。。【注意:加上&则表示最后返回G作为结果,这种便是引用型参数。】

数据结构知识_第51张图片
数据结构知识_第52张图片
数据结构知识_第53张图片

复数构造即加减的具体实现:

#include
typedef struct {
	float realpart;    //定义实部
	float imagpart;    //定义虚部
}Complex;
 
//构造复数
Complex assign(float real,float imag) {
	Complex c;
	c.realpart = real;
	c.imagpart = imag;
	return c;
}
 
//两复数求和
Complex add(Complex A,Complex B){
	Complex c;
	c.realpart = A.realpart + B.realpart;
	c.imagpart = A.imagpart + B.imagpart;
	return c;
}
//两复数求差
Complex minus(Complex A, Complex B) {
	Complex c;
	c.realpart = A.realpart - B.realpart;
	c.imagpart = A.imagpart - B.imagpart;
	return c;
}
int main()
{  
	Complex b,c,d,e;
	b = assign(2.0, 4.0);
	c = assign(1.0, 1.0);
	d = add(b, c);
	e = minus(b, c);
	printf("实部为2虚部为4的复数是:b=%f+%f i\n", b.realpart, b.imagpart);
	printf("实部为1虚部为1的复数是:c=%f+%f i\n", c.realpart, c.imagpart);	
	printf("两复数相加是:d=%f+%f i\n", d.realpart, d.imagpart);
	printf("两复数相减是:d=%f+%f i\n", e.realpart, e.imagpart);
 
	return 0;
}

数据结构知识_第54张图片

❀内容小结

数据结构知识_第55张图片
数据结构知识_第56张图片

1.3 抽象数据类型的表示与实现

数据结构知识_第57张图片
数据结构知识_第58张图片
数据结构知识_第59张图片


数据结构知识_第60张图片
数据结构知识_第61张图片
数据结构知识_第62张图片
main()函数部分:
数据结构知识_第63张图片

typedef用于声明一个已有的数据类型的新名字。

数据结构知识_第64张图片

1.4 算法和算法分析

数据结构知识_第65张图片

算法是求解问题的步骤。

数据结构知识_第66张图片
数据结构知识_第67张图片
数据结构知识_第68张图片
数据结构知识_第69张图片
数据结构知识_第70张图片
数据结构知识_第71张图片


数据结构知识_第72张图片

这里是引用

  • 输入取自于某个特定的对象的集合。
  • 输出是与输入有着某种特定关系的量。

数据结构知识_第73张图片
数据结构知识_第74张图片
数据结构知识_第75张图片
在这里插入图片描述
在这里插入图片描述

数据结构知识_第76张图片

数据结构知识_第77张图片
数据结构知识_第78张图片

矛盾的意思是有时候为了节省时间可能会消耗空间,有时为了节省空间可能会花费更多的时间。【因此需要综合平衡】

1.4.1 算法时间效率的度量

数据结构知识_第79张图片

数据结构知识_第80张图片

【 更多的是选择事前分析法】。

  • 事后统计法存在的问题:
    数据结构知识_第81张图片

数据结构知识_第82张图片

数据结构知识_第83张图片
数据结构知识_第84张图片

若假设每条语句所需的时间均为单位时间,则可以暂时不考虑。


数据结构知识_第85张图片

  • 行一 是从1到n,循环变量执行n次。但是还需要最后执行一次来判断,即条件不成立则退出循环。因此执行n+1次。
  • 行二 是外层循环的循坏体,循环体要执行n次;每执行1次这句语句,都要执行n+1次。因此执行n(n+1)次。
  • 行三 是中层循环的循环体,外层循环每执行一次,中层循环执行n次,而外层循环执行了n次。因此执行了n*n次。

1.4.2 时间复杂度

数据结构知识_第86张图片
数据结构知识_第87张图片
数据结构知识_第88张图片
数据结构知识_第89张图片

数据结构知识_第90张图片
数据结构知识_第91张图片
数据结构知识_第92张图片

由例可知:很多算法执行时间与输入的数据有关。

数据结构知识_第93张图片

一般只考虑最坏和平均。

数据结构知识_第94张图片
数据结构知识_第95张图片
在这里插入图片描述

数据结构知识_第96张图片

口诀:【常对幂指阶】

数据结构知识_第97张图片


例题:
数据结构知识_第98张图片
数据结构知识_第99张图片
数据结构知识_第100张图片
数据结构知识_第101张图片

也可直接写成O(lgn)。即不用去考虑底数具体是多少。

1.4.3 空间复杂度

数据结构知识_第102张图片
数据结构知识_第103张图片
数据结构知识_第104张图片
数据结构知识_第105张图片
数据结构知识_第106张图片
数据结构知识_第107张图片

数据结构知识_第108张图片
数据结构知识_第109张图片

❀内容小结

数据结构知识_第110张图片
数据结构知识_第111张图片

数据结构知识_第112张图片

数据结构知识_第113张图片
数据结构知识_第114张图片

第二章 线性表

2.1 线性表的定义和特点

数据结构知识_第115张图片

数据结构知识_第116张图片
数据结构知识_第117张图片


数据结构知识_第118张图片
数据结构知识_第119张图片

单位历年中,第一年6,第二年17…以此构成前后结点的线性关系。


数据结构知识_第120张图片

2.2 案例引入+分析与实现

2.2.1 一元多项式的运算

把每一项的系数拿出来存成一个线性表。
系数的下标 i 还可隐含地表示指数。

数据结构知识_第121张图片
数据结构知识_第122张图片
在这里插入图片描述


2.2.2 稀疏多项式

数据结构知识_第123张图片
数据结构知识_第124张图片
如相加:

数据结构知识_第125张图片

线性表A中有4项,B中有3项。

  • 假设每项指数均不同,则最多可得7项。
  • 极端情况下每一项刚好指数一样,系数是相反数,则最少可得0项。

数据结构知识_第126张图片

数据结构知识_第127张图片
数据结构知识_第128张图片
数据结构知识_第129张图片
数据结构知识_第130张图片
数据结构知识_第131张图片


2.2.3 图书信息管理系统

数据结构知识_第132张图片
存储方式:
数据结构知识_第133张图片
数据结构知识_第134张图片

❀内容小结

数据结构知识_第135张图片

2.3 线性的类型定义

这里指的类型实际上就是抽象数据类型。

数据结构知识_第136张图片

数据对象就是一些元素,元素的个数n>=0;
序偶关系,ai-1是ai的前驱。
数据结构知识_第137张图片

数据结构知识_第138张图片
数据结构知识_第139张图片
数据结构知识_第140张图片
在这里插入图片描述
数据结构知识_第141张图片
数据结构知识_第142张图片
数据结构知识_第143张图片


数据结构知识_第144张图片

2.4 线性表的顺序表示和实现

2.4.1 线性表的顺序存储表示

(1)顺序表的定义

数据结构知识_第145张图片

元素之间的关系由存储单元的邻接关系来体现。

数据结构知识_第146张图片
数据结构知识_第147张图片

找地址是O(1)
在这里插入图片描述

数据结构知识_第148张图片

在这里插入图片描述

数组长度定义模板

(2)顺序表的实现

I.静态分配

数据结构知识_第149张图片

【顺序表的实现示例代码】
数据结构知识_第150张图片
ps:为给数据元素设置默认值
数据结构知识_第151张图片
【初始化时,设置初始值是必须做的】

数据结构知识_第152张图片

初始就分配很大的内存空间是不可行的。

II.动态分配

数据结构知识_第153张图片
数据结构知识_第154张图片
ps:最终如下
数据结构知识_第155张图片


数据结构知识_第156张图片


例:

数据结构知识_第157张图片
数据结构知识_第158张图片


❀内容小结

数据结构知识_第159张图片

数据结构知识_第160张图片

左边框是静态,右边框是动态。

2.4.2 顺序表基本操作的实现

数据结构知识_第161张图片

画线的较难。


在这里插入图片描述
数据结构知识_第162张图片
ps:加上&
数据结构知识_第163张图片

(1)线性表初始化

数据结构知识_第164张图片

  • 行1:&L即通过引用型变量将构造好了的顺序表L返回。
  • 若成功构造则是为变量L分配空间。
  • 行2:动态分配,获得这个数组中的基地址。
  • 行4:若成功分配,注意此时里面没有元素,因此长度为0。
  • 行3:异常处理。OVERFLOW是溢出的意思,返回的是-2。

(2)销毁线性表

数据结构知识_第165张图片

注意:销毁的前提条件是该线性表存在。

(3)清空线性表

数据结构知识_第166张图片

length代表线性表元素的个数,将其令为0。则表示线性表内无元素,为空。

(4)求线性表长度

数据结构知识_第167张图片

(5)判断是否为空

数据结构知识_第168张图片

返回1表示为空,返回0表不为空。

(6)取值

数据结构知识_第169张图片

算法的时间复杂度为O(1)。

(7)查找

按位查找

【1.静态分配】
数据结构知识_第170张图片


【2.动态分配】
数据结构知识_第171张图片
数据结构知识_第172张图片
数据结构知识_第173张图片


数据结构知识_第174张图片

按值查找

数据结构知识_第175张图片
数据结构知识_第176张图片

这是进行顺序查找的算法。
也可以写成如下:数据结构知识_第177张图片

数据结构知识_第178张图片
数据结构知识_第179张图片
数据结构知识_第180张图片

详见0.6 结构类型的比较


数据结构知识_第181张图片


数据结构知识_第182张图片
数据结构知识_第183张图片

(8)插入

数据结构知识_第184张图片
数据结构知识_第185张图片
数据结构知识_第186张图片

数据结构知识_第187张图片

注意:

  • 如果有n个元素,那么插入的位置只能是0~n+1位置上。
  • 如果线性表容量已经放满,还要插入数据的话,会存在溢出情况。
    【综上,需要首先判断插入位置i是否合法以及存储空间是否已满】

数据结构知识_第188张图片

插入中的移动方式:先后面的元素往后移,再前面的元素往后移

以下是王卓老师的算法
数据结构知识_第189张图片


数据结构知识_第190张图片

算法时间主要耗费在移动元素的操作上。

(9)删除

数据结构知识_第191张图片
数据结构知识_第192张图片

第2步是可以省略的。即直接删除。

数据结构知识_第193张图片

删除中的移动方式:先前面的元素往前移,再后面的元素往前移

数据结构知识_第194张图片


在这里插入图片描述

算法时间主要耗费在移动元素的操作上。

❀ 内容小结

数据结构知识_第195张图片
数据结构知识_第196张图片
数据结构知识_第197张图片

数据结构知识_第198张图片数据结构知识_第199张图片
数据结构知识_第200张图片
数据结构知识_第201张图片
数据结构知识_第202张图片

2.5 线性表的链式表示和实现

数据结构知识_第203张图片
数据结构知识_第204张图片


数据结构知识_第205张图片
数据结构知识_第206张图片


数据结构知识_第207张图片
数据结构知识_第208张图片
数据结构知识_第209张图片

数据结构知识_第210张图片
数据结构知识_第211张图片
数据结构知识_第212张图片
数据结构知识_第213张图片
数据结构知识_第214张图片
数据结构知识_第215张图片

❀内容小结

数据结构知识_第216张图片

2.5.1 单链表的定义和表示

数据结构知识_第217张图片
在这里插入图片描述

  • 包含两部分数据,可用高级语言中的结构体。这个结构中包含两个成员,即data、next。
  • data的数据类型,是由处理问题的本身决定的。如data是多项式中的系数,则是float。因此把需要的元素定义成【ElemType】。
  • next是指针型。它的类型取决于它所存放地址的元素是什么类型。如data是int整型,则next应定义为:int *p;(意思是指向整型变量的指针)。p=&a;(意思是p里存放的是a的指针)。
  • next指向的是和自己的结构完全一样的变量的地址。【因此出现下一点中嵌套的定义】
  • struct Lnode是指向这种类型的指针。(这种类型又包括data、next两个成员的一个指针)。。即用自己来定义自己【嵌套的定义】
  • 注意:最后一行中Lnode,*LinkList都是类型。【若要定义指向结点的指针,可以是 Lnode *L; 也可以是LinkList L;】

数据结构知识_第218张图片

【补充,可忽略】
数据结构知识_第219张图片
数据结构知识_第220张图片
数据结构知识_第221张图片

(1)不带头结点的单链表

数据结构知识_第222张图片

(2)带头结点的单链表

数据结构知识_第223张图片

(3)不带头结点VS带头结点

数据结构知识_第224张图片


数据结构知识_第225张图片

❀内容小结

数据结构知识_第226张图片

2.5.2 单链表基本操作的实现

(1)单链表初始化-带头结点

数据结构知识_第227张图片

(2)判断链表是否空

数据结构知识_第228张图片

(3)销毁

数据结构知识_第229张图片
【销毁单链表是将所有结点,包括头结点和头指针都销毁。内存中不存在该单链表】

  • 用指针变量p操作当前想要操作的结点。
  • 让p一开始指向头结点,然后把指向的结点释放。【一个变量要想指向某一个空间,就把这个空间的地址赋给他】。如若想指向变量a,就是p=&a ; 。【头结点的地址在头指针里存放】。因此让指针p指向头结点,则是 p=L;
  • 得先让L指向下一个结点,才能删除头结点。【头结点的指针域存放了下一节点的地址】,即L=L->next; 。
  • delete p; 是c++中语法。在c语言中是free§;
  • L!=NULL也可表示成L。

数据结构知识_第230张图片

(4)清空

数据结构知识_第231张图片
【清空链表只是将单链表中元素清除,成为一个空链表】

  • 第一步p=L->next; 即p指向首元结点。
  • 得先把下一个结点确定好,才能释放掉前结点。即引入指针变量q预先保存下一个结点的地址。
  • 最后一步p、q指针都指向空后,要将头指针设置为空。

数据结构知识_第232张图片

(5)求表长

数据结构知识_第233张图片


数据结构知识_第234张图片

让指针变量p指向首元结点,若不为空,计数+1且指向下一个结点。到结点为空时结束。

数据结构知识_第235张图片

  • 定义指针变量p可以用 Lnode *p; 这样可读性更好。
  • i是元素个数计数。初始为0。
  • while§表示p指向的结点不为空。

(6)取值

在这里插入图片描述
数据结构知识_第236张图片

  • 如果输入的值超过了元素个数,当指针所指为空,则不需往后找了。
  • 如果i=-1,即小于初始下标的值。一开始便不用找了,因为是错的。

数据结构知识_第237张图片
在这里插入图片描述

  • 初始化一行:首先p指向首元结点,j=1表示这是第一个结点。
  • while(p&&j

(7)查找

数据结构知识_第238张图片

按位查找

数据结构知识_第239张图片
数据结构知识_第240张图片
数据结构知识_第241张图片
数据结构知识_第242张图片

按值查找

数据结构知识_第243张图片
数据结构知识_第244张图片


数据结构知识_第245张图片
数据结构知识_第246张图片
数据结构知识_第247张图片

  • 循环条件:p不为空且当前指针所指的结点值同要找的数据不相同时。
  • 返回:找到了就是那个结点,找不到则返回空。

数据结构知识_第248张图片

(8)插入

按位序插入-带头结点

数据结构知识_第249张图片

数据结构知识_第250张图片
数据结构知识_第251张图片
数据结构知识_第252张图片
数据结构知识_第253张图片

按位序插入-不带头结点

数据结构知识_第254张图片

数据结构知识_第255张图片
数据结构知识_第256张图片

指定结点的后插操作

数据结构知识_第257张图片
数据结构知识_第258张图片

指定结点的前插操作

数据结构知识_第259张图片
数据结构知识_第260张图片
ps:或如下写法:
数据结构知识_第261张图片


【以下是王卓老师部分,可忽略】
数据结构知识_第262张图片数据结构知识_第263张图片

  • 不可以。先执行2的话p->next指向的地址就变了。
  • 如果非要先执行2,则找个暂存指针q存放ai的地址。

数据结构知识_第264张图片

(9)删除

按位序删除-带头结点

数据结构知识_第265张图片
数据结构知识_第266张图片

指定结点的删除

数据结构知识_第267张图片
数据结构知识_第268张图片
数据结构知识_第269张图片


数据结构知识_第270张图片
数据结构知识_第271张图片
数据结构知识_第272张图片

  • 插入算法中i的合理取值范围是1到n+1,删除算法中i的合理取值是1到n。
  • p指向的是ai-1结点,q指向的是ai结点。

(10)建立单链表

数据结构知识_第273张图片

头插法

数据结构知识_第274张图片
数据结构知识_第275张图片


数据结构知识_第276张图片

也叫前插法。

数据结构知识_第277张图片
数据结构知识_第278张图片

尾插法

数据结构知识_第279张图片
数据结构知识_第280张图片
【因此设置一个表尾指针r】
数据结构知识_第281张图片
数据结构知识_第282张图片


数据结构知识_第283张图片

也叫后插法。

在这里插入图片描述

❀内容小结

数据结构知识_第284张图片
数据结构知识_第285张图片

数据结构知识_第286张图片

数据结构知识_第287张图片
数据结构知识_第288张图片
数据结构知识_第289张图片

  • 查找:最好的情况是第一个元素就找到,即1次;最坏的情况是最后一个元素才找到,即n次。

2.5.3 循环链表

数据结构知识_第290张图片
数据结构知识_第291张图片
在这里插入图片描述

使用循环链表时,最多的是使用带尾指针的循环链表。

数据结构知识_第292张图片
数据结构知识_第293张图片
数据结构知识_第294张图片


(1)循环单链表

数据结构知识_第295张图片
数据结构知识_第296张图片

(2)循环双链表

数据结构知识_第297张图片

初始化

数据结构知识_第298张图片

插入

数据结构知识_第299张图片

删除

数据结构知识_第300张图片

❀内容小结

数据结构知识_第301张图片

2.5.4 双向链表

数据结构知识_第302张图片

(1)结构定义

数据结构知识_第303张图片
数据结构知识_第304张图片
数据结构知识_第305张图片

(2)初始化

数据结构知识_第306张图片

(3)插入

数据结构知识_第307张图片


数据结构知识_第308张图片
数据结构知识_第309张图片

GetElemP_DuL(L,i)是查找链表L中的第i个元素的操作。

(4)删除

数据结构知识_第310张图片


数据结构知识_第311张图片
数据结构知识_第312张图片

(5)遍历

数据结构知识_第313张图片

❀内容小结

数据结构知识_第314张图片

2.5.5 静态链表

(1)定义

数据结构知识_第315张图片
数据结构知识_第316张图片

王道书
数据结构知识_第317张图片
数据结构知识_第318张图片

(2)基本操作

数据结构知识_第319张图片

数据结构知识_第320张图片
数据结构知识_第321张图片

❀内容小结

数据结构知识_第322张图片

2.5.6 单链表、循环链表、双向链表的时间效率比较

数据结构知识_第323张图片

双向循环链表是消耗了空间来提升时间效率。

❀内容小结

数据结构知识_第324张图片
数据结构知识_第325张图片

2.6 顺序表和链表的比较

  • 都属于线性表,都是线性结构。
    数据结构知识_第326张图片
    在这里插入图片描述
❀内容小结

数据结构知识_第327张图片

2.7 线性表的应用

数据结构知识_第328张图片
数据结构知识_第329张图片
数据结构知识_第330张图片


数据结构知识_第331张图片
数据结构知识_第332张图片
数据结构知识_第333张图片
数据结构知识_第334张图片
在这里插入图片描述

  • 基地址+(表长-1)=最后一个元素地址。即pa_last=LA.elem+LA.length-1;

数据结构知识_第335张图片
数据结构知识_第336张图片
数据结构知识_第337张图片
数据结构知识_第338张图片
数据结构知识_第339张图片
数据结构知识_第340张图片
数据结构知识_第341张图片

空间复杂度是O(1)

第三章 栈和队列

3.1 栈和队列的定义和特点

数据结构知识_第342张图片

  • 栈如枪装子弹的弹夹; 队列如日常生活的排队。
  • 栈只能在队尾插入,在队尾删除。
  • 队列只能在队尾插入,在队头删除。

数据结构知识_第343张图片
数据结构知识_第344张图片

3.1.1 栈的定义和特点

数据结构知识_第345张图片
数据结构知识_第346张图片
数据结构知识_第347张图片

数据结构知识_第348张图片

数据结构知识_第349张图片
数据结构知识_第350张图片
数据结构知识_第351张图片
数据结构知识_第352张图片
数据结构知识_第353张图片
数据结构知识_第354张图片
数据结构知识_第355张图片
数据结构知识_第356张图片
数据结构知识_第357张图片
数据结构知识_第358张图片

3.1.2 队列的定义和特点

数据结构知识_第359张图片
数据结构知识_第360张图片
数据结构知识_第361张图片

3.2 案例引入+分析与实现

数据结构知识_第362张图片

3.3.1 栈-进制转换

数据结构知识_第363张图片
数据结构知识_第364张图片

3.3.2 栈-括号匹配的检验

数据结构知识_第365张图片

3.3.3 表达式求值

数据结构知识_第366张图片
数据结构知识_第367张图片
数据结构知识_第368张图片

3.3.4 队列-舞伴问题

数据结构知识_第369张图片

3.3 栈的表示和操作的实现

3.3.1 栈的抽象数据类型的类型定义

数据结构知识_第370张图片
数据结构知识_第371张图片


数据结构知识_第372张图片

3.3.2 顺序栈的表示和实现

数据结构知识_第373张图片
数据结构知识_第374张图片
数据结构知识_第375张图片
数据结构知识_第376张图片
数据结构知识_第377张图片

  • top和base可以定义成整型,用它们存放数组的下标。【这种方式就是用下标来引用数组中的元素】
  • top和base还可以定义成指针。两个指针相减即两个指针之间的元素个数。 【注意这两个指针必须指向同一数组才可以相减】

数据结构知识_第378张图片
数据结构知识_第379张图片
数据结构知识_第380张图片
数据结构知识_第381张图片

if(S.base)表示当前栈不为空。

数据结构知识_第382张图片
数据结构知识_第383张图片
数据结构知识_第384张图片

3.3.3 链栈的表示和实现

数据结构知识_第385张图片
数据结构知识_第386张图片
数据结构知识_第387张图片
数据结构知识_第388张图片
数据结构知识_第389张图片
数据结构知识_第390张图片
数据结构知识_第391张图片

3.4 栈与递归

数据结构知识_第392张图片
数据结构知识_第393张图片
数据结构知识_第394张图片
数据结构知识_第395张图片
数据结构知识_第396张图片
数据结构知识_第397张图片
数据结构知识_第398张图片
数据结构知识_第399张图片
数据结构知识_第400张图片

函数的调用就是栈。

数据结构知识_第401张图片
数据结构知识_第402张图片
数据结构知识_第403张图片
数据结构知识_第404张图片

递归的时间效率较差。

数据结构知识_第405张图片
数据结构知识_第406张图片
数据结构知识_第407张图片
数据结构知识_第408张图片
数据结构知识_第409张图片

3.5 队列的表示和操作的实现

3.5.1 队列的抽象数据类型定义

数据结构知识_第410张图片

3.5.2 队列的顺序表示和实现

数据结构知识_第411张图片

  • 定义*base用来指向数组中的首元素。
  • front、rear称作指针,但不是指针变量。是用来表示数组中元素的下标位置的。如front指向队头元素的下标。

数据结构知识_第412张图片
数据结构知识_第413张图片
数据结构知识_第414张图片


数据结构知识_第415张图片

  • Q.base[Q.rear]=x; 将元素放在尾指针所指的位置
  • 当Q.rear+1达到MAXQSIZE时,则对MAXQSIZE模后可以得到0。(即回到了队尾)
  • x=Q.base[s.front]; 将表头指针所指的元素赋给x,即要删除的值。

数据结构知识_第416张图片

数据结构知识_第417张图片
数据结构知识_第418张图片
数据结构知识_第419张图片

分配的是一个数组空间,数组的首元素地址实际上就是一个指针。因此定义的是Q.base。【即base指向数组空间的首地址】

数据结构知识_第420张图片

循环队列的差值可能是负数,加上MAXQSIZE,求余便可得到循环队列的个数。
数据结构知识_第421张图片
采用的是少用一个元素空间的方法。
数据结构知识_第422张图片

数据结构知识_第423张图片

3.5.3 队列的链式表示和实现

数据结构知识_第424张图片

*QuenePtr 指向结点的指针类型。

数据结构知识_第425张图片
数据结构知识_第426张图片

在内存中分配新结点,实际上很少会内存连一个结点的位置都没有,因此一般很少判断是否溢出。

数据结构知识_第427张图片

绿色字是直接使用Q.rear。不额外利用新的空间。

数据结构知识_第428张图片
数据结构知识_第429张图片
在这里插入图片描述
数据结构知识_第430张图片
数据结构知识_第431张图片

第四章 串、数组和广义表

数据结构知识_第432张图片

4.1 串

4.1.1 串的定义

数据结构知识_第433张图片
数据结构知识_第434张图片

  • 空串是里面不包含任何字符,连空格都没有。即""
  • 空格串里面有若干个空格。即" "

数据结构知识_第435张图片
数据结构知识_第436张图片

  • 主要d中含有一个空格,因此长度是8。
  • d的字串不包含c是因为字串的字符应该是连续的。d中的空格断开了BEIJING。

数据结构知识_第437张图片

4.1.2 案例引入、分析与实现

(1)病毒感染检测

数据结构知识_第438张图片
数据结构知识_第439张图片
数据结构知识_第440张图片

可以用BF或KMP算法实现。

数据结构知识_第441张图片
复制一次,长度变成2m,每次截取m个字符,看是否匹配。匹配了就说明感染了。
匹配的字数,看m等于几。如果是3个字符,则比较3遍就够了:
数据结构知识_第442张图片
数据结构知识_第443张图片
数据结构知识_第444张图片
数据结构知识_第445张图片

4.1.3 串的类型定义、存储结构及其运算

数据结构知识_第446张图片
数据结构知识_第447张图片
数据结构知识_第448张图片

实际中,顺序串用的更多。因为对字符串进行插入和删除操作是比较少的;多数是匹配和查找运算(用顺序更方便)。

数据结构知识_第449张图片

  • 顺序:逻辑关系直接映射物理结构。
  • 后面在研究串的算法时,通常从1号位置往后存储,0号位置闲置不用。

数据结构知识_第450张图片
数据结构知识_第451张图片

  • 假设一个块放50个。
  • 常用下面那种结构,称为块链。

数据结构知识_第452张图片


数据结构知识_第453张图片

(1) BF算法

BF即暴力破解法。简单但时间效率相对较差。
数据结构知识_第454张图片
子串即查找的内容。
数据结构知识_第455张图片
数据结构知识_第456张图片
数据结构知识_第457张图片


数据结构知识_第458张图片
第0位不存储。第一位发现一样,则继续匹配下一位。
数据结构知识_第459张图片
数据结构知识_第460张图片
发现不匹配后,再往后移动一位。用新的4位来比较。此时需要将i回退到第二个字符的位置,j从头开始。
数据结构知识_第461张图片
i=i-j+2:

  • +T从1移动到 j,移动了j-1个长度;此时S移动的也是j-1。S目前位置是i,用目前的位置i减去移动的位置j-1得到移动前初始位置1(S也是从1开始移动的)。因此【i-j+1】表示移动前的初始位置。
  • 【(i-j+1)+1】就是初始位置的下一个位置(满足了往后移一位再比较)。

回溯就是造成这个算法效率比较低的主要原因。

如下:注意j是回到1
数据结构知识_第462张图片
数据结构知识_第463张图片
数据结构知识_第464张图片
数据结构知识_第465张图片
返回值是 i的最终位置 减去 查找字符串的串长。

数据结构知识_第466张图片

pos表示位置。

数据结构知识_第467张图片

  • 这个算法是从第一个位置开始查找。
  • 红框中>=还是>的问题见下面一点。

数据结构知识_第468张图片

定义了pos,则开始比较的值更为灵活。


分析时间复杂度:(模式T含有m个字符)
  • 最好的情况:第一次就找到了,则m个字符循环比较了m次。时间复杂度为O(m)。
  • 最差的情况:
    数据结构知识_第469张图片
  • 平均:是O((n/2)*m),也就是O(mn)
  • 书上是>,王卓老师讲义是>=。由以下代码实现,表面出现结果一致,均不影响最终答案。
  • 原因为:最终j=T.length时,满足了 if的条件。但是while循环还是没有结束的,还是满足while循环条件的。因此还要执行一下while循环。执行一次while循环后,i+1,j+1。然后就j一定大于T.length,此时条件不满足while循环条件,就终止了。因此【=是满足的】
#include 
#include 
#include
#define MAXSIZE 20

typedef struct SString
{
    char ch[MAXSIZE+1];
    int length;
}SString;
int GetLength(char *L)//得到字符数组的长度
{
    int n = 0;
    char *p = L;
    while(*p!='\0')
    {
        n++;
        p++;
    }
    return n;
}
void initSString(SString * L)//初始化串
{
    char a[MAXSIZE];//定义一个辅助数组
    scanf("%s",a);
    char *p= L->ch;//定义一个字符指针,指向串里面的数组
    strcpy(++p,a);//在数组的下标为1的位置开始赋值,注意为了方便,我们不采用0开始的下标
    L->length = GetLength(a);//顺便给长度赋值
}
int index(SString S,SString T,int pos)//返回模式L2在主串L1中第pos个字符开始第一次出现的位置。如果不存在,则返回值为0
{
    int i = pos;//初始化
    int j = 1;
    while(i<=S.length&&j<=T.length)//俩串都未比较到串尾
    {
        if(S.ch[i]==T.ch[j])
        {
            i++;
            j++;
        }else//指针回退,重新开始比较
        {
            i = i-j+2;
            j=1;
        }
    }
    if(j>=T.length)
    {
        return i-T.length;
    }else
    {
        return 0;
    }
}
int main()
{
    SString S;
    SString T;
    printf("请输入主串\n");
    initSString(&S);
    printf("请输入模式串\n");
    initSString(&T);
//    printf("请输入要从主串的第几个元素进行匹配\n");
    int a=1;
//    int a;
//    scanf("%d",&a);
    if(index(S,T,a))
    {
        printf("匹配成功,在主串的第%d个位置匹配成功\n",index(S,T,a));
    }else
    {
        printf("匹配失败\n");
    }
    return 0;
}

(2) KMP算法

❀天勤率辉-KMP算法(易懂版)与王卓老师结合
建议看 天勤率辉-KMP算法(易懂版) 入门,真的很容易懂!
数据结构知识_第470张图片

  • KMP算法:快速地从一个主串中找出一个想要的子串。(可以做到仅仅后移模式串,比较指针不回溯)
    数据结构知识_第471张图片
  • 这里指针位置所指元素不匹配。(指针左边元素完全匹配)
  • 可看到指针前面已经匹配的串中 左右两端都有AB子串,他们完全匹配。则称为模式串的公共前后缀。
    数据结构知识_第472张图片
  • 这一步是KMP算法核心:直接移动模式串,使得【公共前后缀】的前缀直接移动到原先后缀所在的位置。
  • 【最长公共前后缀】:如果模式串中有多对公共前后缀,要取最长的那对。
  • 其实找公共前后缀时只用看模式串即可。
    数据结构知识_第473张图片
  • 使公共前后缀的前缀移动到原先后缀所在的位置,这样做保证了当前比较指针所在的位置 左边的串上下是一致的
    数据结构知识_第474张图片
  • 当前移动位置,模式串和主串匹配了,指针继续往后扫描。又发现如下不匹配。
    数据结构知识_第475张图片
  • 再次寻找公共前后缀。
    数据结构知识_第476张图片
  • 移动模式串,将公共前后缀的前缀移到后缀位置上
    数据结构知识_第477张图片
  • 此时发现模式串已经超出主串的范围,就可以判定失败。即主串不含有与模式串相匹配的子串。

上述是未查找到的情况,接下来我们试验正确查找到的情况

数据结构知识_第478张图片
数据结构知识_第479张图片
数据结构知识_第480张图片
数据结构知识_第481张图片
数据结构知识_第482张图片
数据结构知识_第483张图片
发现最后是匹配的。因此匹配成功

❗注意字符串存放在一个字符数组中,数组在内存中不可能移动。上述所说移动只是一个形象化的方式。

我们以如下模式串研究:

  • 为了方便处理,我们将该模式串放在数组中,并标出数组下标。【注意模式串是从下标为1的位置开始存储的】→(从0开始也可以,原理一样,只是大多数学校是从1)
    数据结构知识_第484张图片
  • 假设该模式串可能和任意主串进行KMP算法。因此每一个位置上都可能发生不匹配。
  • 假设第一个位置就发生了不匹配。
    数据结构知识_第485张图片
  • 则把模式串移一位。重新开始比较。
    数据结构知识_第486张图片
  • 在代码中的描述应该为:让模式串中1号位置的字符与主串下一个位置的字符开始比较。
    数据结构知识_第487张图片
  • 如果二号位发生不匹配。
    数据结构知识_第488张图片
  • 此时指针前的子串长度只有1,公共前后缀长度为0,于是移动后落在模式串中 指针左边的子串长度也为0。
    数据结构知识_第489张图片
  • 在代码中的描述是:比较指针所指的位置就是主串中发生不匹配的位置,称为当前位置。此种情况下,拿 模式串的1号位 与 主串中当前位置 进行比较。
    数据结构知识_第490张图片
  • 若3号位 发生不匹配。
  • 继续找公共前后缀,此时指针左边的子串为AB,公共前后缀长度为0。与2号位情况相同。
    数据结构知识_第491张图片
  • 若4号位发生不匹配。
  • 寻找到公共前后缀
    数据结构知识_第492张图片
    数据结构知识_第493张图片
    数据结构知识_第494张图片
  • 后面的类似前面的。
  • 可发现一个规律【若公共前后缀长度为n,则在n+1号为与主串当前位开始比较】
    数据结构知识_第495张图片
    数据结构知识_第496张图片
  • 可以看到除了第一句话外,其余所有的描述都类似。因此将第一句话标记为0。(当看到0,就按照第一句话描述的方式去处理)
    数据结构知识_第497张图片
  • 则代码中可表示f(0)则按第一句话做。后面的每句话把开头的 号位的数字拿出来作为 这句话所要执行的操作的代号。
    数据结构知识_第498张图片
  • 再结合上面的数组下标,将其放在一个数组中。
    数据结构知识_第499张图片
  • 由此可以判断出模式串中任一位置发生不匹配时的操作。如模式串1位置发生不匹配,数组1位置值为0,则找到之前分析得到的操作(1号位与主串下一位比较)
  • 因此 它叫做下一步数组,即next数组。

数据结构知识_第500张图片

next[j]存储j的下一个位置。
数据结构知识_第501张图片

  • next[j]和主串没关系,只和模式串有关系。
  • 【从头开始的k-1个元素指的就是前缀】。如一个字符串abcd:a是前缀;ab是前缀;abc是前缀;但是abcd不是前缀。
  • 【j前面的k-1个元素指的是后缀】。如一个字符串abcd:d是后缀;cd是后缀;bcd是后缀;但是abcd不是后缀。
  • 如果字符串的前缀和j这个位置前面的若干个元素相等的话,则获得k的值。【k的值可能不止一个,因此需要找到最大值作为下一个j的位置】
  • 如果上述没有找到k,此时j也不为1,则是其他情况。

数据结构知识_第502张图片
数据结构知识_第503张图片
next[j]代码:
数据结构知识_第504张图片
数据结构知识_第505张图片

数据结构知识_第506张图片
数据结构知识_第507张图片

4.2 数组

数据结构知识_第508张图片
数据结构知识_第509张图片

可以看成非线性原因:一个元素不止有1个前驱和后继。如a11前驱有a01和a10。
因此把二维数组看成特殊的线性结构,是线性结构的扩展。

数据结构知识_第510张图片

typedef array1 arry2[m]

  • arry2[m]中有m个元素,这m个元素是array1类型;
  • 而array1类型是有n个元素的一维数组;
  • 因此这句话是一共有m个 含有n个元素的一维数组。因此也定义出一个二维数组。

数据结构知识_第511张图片

4.2.1 数组的抽象数据类型定义

数据结构知识_第512张图片
数据结构知识_第513张图片

画波浪线的地方表示的是前驱后继的序偶关系。

数据结构知识_第514张图片

4.2.2 数组的顺序存储

数据结构知识_第515张图片
数据结构知识_第516张图片
数据结构知识_第517张图片

C、Java都是行优先。

数据结构知识_第518张图片
数据结构知识_第519张图片

数据结构知识_第520张图片
数据结构知识_第521张图片
最后一个的下标是mn-1(从0开始存储)

数据结构知识_第522张图片

  • 先分析元素前有几行,如a[ 2 ] [ 1 ]前面有2行。。则a[ i ][ j ]前面有 i 行。 这i行每行都有n个元素,因此总共是in个元素。
    再分析元素前有几列,如a[ 2 ] [ 1 ]前面有1列。。则a[ i ][ j ]前面有 j 行。 前面则有 j 个元素。
  • 因此a[ i ][ j ] 前面总共有 in+j 个元素。
  • 这些元素总共占用的空间便是 L*(in+j)。
  • a[ i ][ j ] 的地址便是首元素地址+L*(in+j)=a+L*(in+j)。

数据结构知识_第523张图片

知道某个元素的位置:先确定他前面存了多少页,在数出该元素所在页前面的行数,再确定所在行前面的个数。

数据结构知识_第524张图片
数据结构知识_第525张图片
数据结构知识_第526张图片


数据结构知识_第527张图片

4.2.3 特殊矩阵的压缩存储

数据结构知识_第528张图片
数据结构知识_第529张图片

数据结构知识_第530张图片
数据结构知识_第531张图片
【K值就对应的值在一维数组中存放的位置】。


aij对应的k值如何求?

  • 要判断他前面有多少个元素。
  • 首先判断前面有多少行:前面有i-1行,第一行1个元素、第二行2个元素…因此前i-1行共有元素1+2+3+…+(i-1);
  • 然后判断本行 aij前有多少个元素:j-1。
  • 因此aij前面共有【1+2+3+…+(i-1)】+【j-1】。即k值。

数据结构知识_第532张图片

数据结构知识_第533张图片
用二维数组去存。

  • 一条一条对角线的去存。主对角线存在第0行;其他对角线两边对称地存。
    数据结构知识_第534张图片

数据结构知识_第535张图片
数据结构知识_第536张图片


数据结构知识_第537张图片
数据结构知识_第538张图片
数据结构知识_第539张图片
数据结构知识_第540张图片

  • 每一行有1个指针指向这一行的非0元素。同理每列。
    数据结构知识_第541张图片

4.3 广义表

数据结构知识_第542张图片
数据结构知识_第543张图片
数据结构知识_第544张图片
数据结构知识_第545张图片
数据结构知识_第546张图片
数据结构知识_第547张图片
数据结构知识_第548张图片

第五章 树和二叉树

数据结构知识_第549张图片
数据结构知识_第550张图片

5.1 树和二叉树的定义

5.1.1 树的定义

数据结构知识_第551张图片

树的定义就是个递归嵌套的定义。

数据结构知识_第552张图片
数据结构知识_第553张图片

凹入表示:用凹入的深度表示层次,凹入得越深表示层次越低。

5.1.2 树的基本术语

数据结构知识_第554张图片

  • 结点:数据元素以及指向子树的分支。
  • 一个树中根结点只有一个。
  • 结点的度可以直接看后继结点的个数。
  • 有共同双亲的结点称为兄弟结点。
  • M的祖先:A、D、H。
  • D的子孙:H、I、J、M。
  • 树的深度:树中结点的最大层次。(也称为树的高度)。

数据结构知识_第555张图片
数据结构知识_第556张图片
数据结构知识_第557张图片

5.1.3 二叉树的定义

数据结构知识_第558张图片
数据结构知识_第559张图片
数据结构知识_第560张图片

❗二叉树不是树,也不是有序树。

数据结构知识_第561张图片
数据结构知识_第562张图片
数据结构知识_第563张图片

(1)满二叉树

数据结构知识_第564张图片
数据结构知识_第565张图片

(2)完全二叉树

数据结构知识_第566张图片
数据结构知识_第567张图片
数据结构知识_第568张图片
数据结构知识_第569张图片
数据结构知识_第570张图片

5.2 案例引入、分析与实现

5.2.1 数据压缩问题

数据结构知识_第571张图片

等长会比较浪费。
c是非前缀码,其坏处是如果码中出现一个0便搞不清楚是a、b还是c中的第一个0。
b是前缀码。既不等长又是前缀码 是我们常用的。实现方法:哈夫曼树和哈夫曼编码。

5.2.2 利用二叉树求解表达式的值

数据结构知识_第572张图片

  • 叶子结点上是运算数,叶子结点的双亲结点都是运算符。
  • 对这个二叉树进行【后序遍历】运算即可得到表达式。

5.3 树和二叉树的抽象数据类型定义

数据结构知识_第573张图片

数据元素的说明即根、结点、左孩子右孩子的说明。

  • 基本操作
    数据结构知识_第574张图片

5.4 二叉树的性质和存储结构

5.4.1 性质

数据结构知识_第575张图片
数据结构知识_第576张图片

二叉树每一个结点的后继结点最多有两个。


在这里插入图片描述

数据结构知识_第577张图片
在这里插入图片描述

数据结构知识_第578张图片

  • n是结点总数;B是边数;n1是度为1的结点数。
  • 第一张图从下往上分析:每一个结点到它的双亲结点都要有一个分支,而只有根节点没有。因此如果有n个结点,那么边数等于结点数-1,即B=n-1。
  • 第二张图从上往下分析:度为2的结点会产生2条边,度为1的结点产生1条边,叶子结点不产生边。

数据结构知识_第579张图片
证:假设有n个结点,在第k层上。数据结构知识_第580张图片

数据结构知识_第581张图片
证明还是用归纳法(不需知道)
数据结构知识_第582张图片

5.4.2 存储结构

数据结构知识_第583张图片

(1)顺序存储

数据结构知识_第584张图片
数据结构知识_第585张图片

数据结构知识_第586张图片

  • TElemType是根据树的存储来决定的,如可以是int、char…
  • bt是一个数组。

数据结构知识_第587张图片

数据结构知识_第588张图片
对应的是满二叉树的编号。

(2)二叉链表

数据结构知识_第589张图片
数据结构知识_第590张图片
数据结构知识_第591张图片

数据结构知识_第592张图片

  • 每个结点都可能有 2个结点,因此最多可能有2n个链域。
  • 此题应该倒过来分析,孩子 一定有双亲,即有一条边(每个结点的前驱最多只有一个,而只有根结点没有)。
  • 因此一共有n-1个结点有指针域,即一共有n-1个指针域。

(3)三叉链表

方便找双亲
数据结构知识_第593张图片

5.5 遍历二叉树和线索二叉树

5.5.1 遍历二叉树

数据结构知识_第594张图片
数据结构知识_第595张图片

重点研究前三种

数据结构知识_第596张图片
数据结构知识_第597张图片

(1)先序遍历

数据结构知识_第598张图片

数据结构知识_第599张图片
数据结构知识_第600张图片

算法的执行:
数据结构知识_第601张图片
数据结构知识_第602张图片
数据结构知识_第603张图片
数据结构知识_第604张图片
数据结构知识_第605张图片

(2)中序遍历

数据结构知识_第606张图片

中序遍历递归算法数据结构知识_第607张图片
数据结构知识_第608张图片

中序遍历非递归算法
数据结构知识_第609张图片
数据结构知识_第610张图片

  • 定义这个算法时,变声明了一个指针T,指向根结点。
  • 当D的右子树访问完时,即A的左子树访问完时。【此时即p为空,由循环条件便去访问栈中元素】。便可访问根结点A。然后再访问A的右子树。
    数据结构知识_第611张图片
    数据结构知识_第612张图片
    数据结构知识_第613张图片
    数据结构知识_第614张图片
    数据结构知识_第615张图片
    数据结构知识_第616张图片
    数据结构知识_第617张图片

(3)后序遍历

数据结构知识_第618张图片
数据结构知识_第619张图片
数据结构知识_第620张图片

(4)遍历算法的分析

数据结构知识_第621张图片
数据结构知识_第622张图片

数据结构知识_第623张图片

  • 三个的时间算法复杂度是一样的,每个结点都需要路过一次。
  • 遇到某一个结点,如果不访问它,就需要找地方先存储,等回来的时候再访问。这时候便需要用到【存储空间】。因此需要有一个【栈】存储暂时不访问的结点。【最坏的情况是一个单支结点,即需要暂时存储n个结点】

❀例题
数据结构知识_第624张图片
数据结构知识_第625张图片
数据结构知识_第626张图片

数据结构知识_第627张图片

前后序可以确定根,中序可确定左右子树。

数据结构知识_第628张图片
数据结构知识_第629张图片
数据结构知识_第630张图片

数据结构知识_第631张图片

(5)层次遍历

数据结构知识_第632张图片
数据结构知识_第633张图片
数据结构知识_第634张图片
数据结构知识_第635张图片

p指代的是指向根结点的指针。

数据结构知识_第636张图片
数据结构知识_第637张图片
数据结构知识_第638张图片
数据结构知识_第639张图片
数据结构知识_第640张图片
数据结构知识_第641张图片
数据结构知识_第642张图片
数据结构知识_第643张图片
数据结构知识_第644张图片
在这里插入图片描述

  • 最后发现队列中元素为空了,层次遍历 便结束。

5.5.2 二叉树遍历算法的应用

(1)二叉树的建立

数据结构知识_第645张图片

  • 只知先序序列,不可以唯一确定二叉树。
  • 因此补充好空结点,这样输出的才是唯一的。【可以用 空格符或# 表示空结点】

数据结构知识_第646张图片

BiTree &T建立的是以链式存储的二叉树。

数据结构知识_第647张图片

(2)复制二叉树

数据结构知识_第648张图片

和先序遍历是类似的,都是根左右。

数据结构知识_第649张图片

(3)计算二叉树的深度

数据结构知识_第650张图片

(4)计算结点总数

数据结构知识_第651张图片

+1是根结点。

数据结构知识_第652张图片

  • 箭头表示执行流程。
  • 往下执行函数,到了最后一层可得到值,再一层一层返回,得到最终值。

(5)计算叶子结点数

数据结构知识_第653张图片

  • 不为空,则又继续下一层,即以左孩子为参数,如果左孩子为空,则以右孩子为参数。
  • 左右孩子都为空即为叶子结点。
  • 左子树判断完了后,返回上层,开始右子树的逐层调用。

数据结构知识_第654张图片

5.5.3 线索二叉树

数据结构知识_第655张图片
数据结构知识_第656张图片

二叉链表中空指针域有n+1个。

数据结构知识_第657张图片

数据结构知识_第658张图片
数据结构知识_第659张图片

  • 如果没有后继,就继续为空。
  • C为中序遍历第一个结点,因此左孩子的指针域继续为空。后继结点为B(看中序节点),因此右孩子指针结点指向B。

数据结构知识_第660张图片

数据结构知识_第661张图片
数据结构知识_第662张图片
数据结构知识_第663张图片
数据结构知识_第664张图片

数据结构知识_第665张图片
在这里插入图片描述
数据结构知识_第666张图片
数据结构知识_第667张图片

5.6 树和森林

数据结构知识_第668张图片

  • 树去掉根结点就变成森林。
  • 给所有森林加一个共同的根结点即为树。

5.6.1 树的存储结构

(1)双亲表示法

数据结构知识_第669张图片

R没有双亲,即双亲域为-1

数据结构知识_第670张图片

(2)孩子链表

数据结构知识_第671张图片
数据结构知识_第672张图片

(3)双亲与孩子结合

数据结构知识_第673张图片

(4)孩子兄弟表示法

数据结构知识_第674张图片
数据结构知识_第675张图片

  • 往右走 可以找到所有兄弟结点
  • 于是 往左走,然后一直往右走 可以找到所有孩子。

还是找双亲困难。但是可以根据需要 增加双亲结点的数据域(像(3))。

5.6.2 树与二叉树的转换

数据结构知识_第676张图片

  • 树的二叉链表存储(孩子兄弟表示法)
    数据结构知识_第677张图片
    数据结构知识_第678张图片

数据结构知识_第679张图片
数据结构知识_第680张图片

数据结构知识_第681张图片

数据结构知识_第682张图片

5.6.3 森林与二叉树的转换

数据结构知识_第683张图片
数据结构知识_第684张图片
数据结构知识_第685张图片
数据结构知识_第686张图片

5.6.4 树森林的遍历

(1)树的遍历

数据结构知识_第687张图片

(2)森林的遍历

数据结构知识_第688张图片

先序:123
中序:213
后序:312

数据结构知识_第689张图片
数据结构知识_第690张图片
数据结构知识_第691张图片

5.7 哈夫曼树及其应用

数据结构知识_第692张图片


数据结构知识_第693张图片

数据结构知识_第694张图片

  • 改进:
    数据结构知识_第695张图片
    数据结构知识_第696张图片
    数据结构知识_第697张图片

5.7.1 哈夫曼树的基本概念

数据结构知识_第698张图片
数据结构知识_第699张图片

  • 0是根结点到自身的长度。
  • 包含结点数相同 的树 的路径长度可能是不相同的。

路径长度最短的不一定是完全二叉树

数据结构知识_第700张图片

某种含义不一定,具体看树用于某种场合。如五分制成绩中的权代表分数占的比例(5%是<60所占比例)。

数据结构知识_第701张图片
数据结构知识_第702张图片
在这里插入图片描述

  • 满二叉树不一定是哈夫曼树。
  • 哈夫曼树中权越大的叶子离根越近。
  • 具有相同带权结点的哈夫曼树不唯一。

5.7.2 构造哈夫曼树

数据结构知识_第703张图片
数据结构知识_第704张图片
数据结构知识_第705张图片
数据结构知识_第706张图片

  • n-1个新结点,每个结点都是度为2。【所有结点的度都不为1】
  • 得到的哈夫曼树最高就是n-1层。因为经过n-1次合并。

数据结构知识_第707张图片

5.7.3 哈夫曼树构造算法的实现

(1)顺序存储——一维结构数组

数据结构知识_第708张图片

  • weight是权值。
  • H可以表示指针,也可以表示数组。

数据结构知识_第709张图片
数据结构知识_第710张图片
数据结构知识_第711张图片
数据结构知识_第712张图片
接下来,重复2.3。
剩下一个parent为0 的即结束。
数据结构知识_第713张图片

数据结构知识_第714张图片
数据结构知识_第715张图片
数据结构知识_第716张图片
数据结构知识_第717张图片

在这里插入图片描述
数据结构知识_第718张图片
数据结构知识_第719张图片
最后一排的lch是13。

5.7.4 哈夫曼码

(1)设计哈夫曼编码

数据结构知识_第720张图片
数据结构知识_第721张图片
数据结构知识_第722张图片

在这里插入图片描述
数据结构知识_第723张图片

数据结构知识_第724张图片

数据结构知识_第725张图片
数据结构知识_第726张图片

(2)哈夫曼编码的算法实现

数据结构知识_第727张图片
数据结构知识_第728张图片

  • 从下往上找并判断是左孩子还是右孩子。(左孩子记为0,右孩子记为1)
  • 一直到根结点为止
  • 找到的编码需翻转,如G从下往上的为00001,则最终G的哈夫曼编码应该为10000。

数据结构知识_第729张图片

  • HC[i] 由字符串构成的数组,即最终的哈夫曼编码。
  • start即 哈夫曼编码的位数。哈夫曼的最大层数(n-1)即哈夫曼编码的最大位数。
  • 将哈夫曼编码作为字符串来看待,因此cd[start]的最后一个位置用来存放字符串结束标志 \0
  • 倒着存储,因此从第n-1位置开始存储。
    数据结构知识_第730张图片

数据结构知识_第731张图片

(3)文件的编码和解码

数据结构知识_第732张图片
数据结构知识_第733张图片

得到的一种哈夫曼编码,共需1596位。

数据结构知识_第734张图片
数据结构知识_第735张图片

数据结构知识_第736张图片

数据结构知识_第737张图片
数据结构知识_第738张图片

第六章 图

6.1 图的定义和基本术语

数据结构知识_第739张图片
数据结构知识_第740张图片
数据结构知识_第741张图片

  • 无向图称为边,有向图称为弧。
  • ()表示两个没有先后关系;<>表示两个有先后关系,即序偶。

数据结构知识_第742张图片
数据结构知识_第743张图片
数据结构知识_第744张图片
【注:路径上的各顶点均不互相重复,称这样的路径为简单路径】
数据结构知识_第745张图片
数据结构知识_第746张图片
数据结构知识_第747张图片
数据结构知识_第748张图片
数据结构知识_第749张图片
数据结构知识_第750张图片

6.2 案例引入、分析与实现

6.2.1 六度空间理论

数据结构知识_第751张图片
数据结构知识_第752张图片

6.3 图的类型定义

数据结构知识_第753张图片

信息即权。

数据结构知识_第754张图片
数据结构知识_第755张图片

6.4 图的存储结构

数据结构知识_第756张图片

6.4.1 数组表示法(邻接矩阵)

(1)邻接矩阵的表示

数据结构知识_第757张图片

  • 邻接矩阵是n*n的,n是顶点数。
  • 邻接矩阵是唯一的

数据结构知识_第758张图片
数据结构知识_第759张图片
在这里插入图片描述

(2)邻接矩阵的建立

数据结构知识_第760张图片

数据结构知识_第761张图片
数据结构知识_第762张图片
数据结构知识_第763张图片
数据结构知识_第764张图片

数据结构知识_第765张图片

(3)邻接矩阵的优缺点

数据结构知识_第766张图片
数据结构知识_第767张图片

6.4.2 链式存储结构

(1)邻接表

数据结构知识_第768张图片

  • nextarc 链域:指示下一条边或弧。
  • 可用info存放边的权值或其他信息。在这里插入图片描述

数据结构知识_第769张图片

数据结构知识_第770张图片
数据结构知识_第771张图片

数据结构知识_第772张图片
数据结构知识_第773张图片
数据结构知识_第774张图片

数据结构知识_第775张图片
数据结构知识_第776张图片
数据结构知识_第777张图片
数据结构知识_第778张图片

数据结构知识_第779张图片
在这里插入图片描述
数据结构知识_第780张图片

用的头插法

数据结构知识_第781张图片

(2)邻接多重表

数据结构知识_第782张图片
数据结构知识_第783张图片

(3)十字链表

数据结构知识_第784张图片
数据结构知识_第785张图片

  • firstin第一条入弧,firstout第一条出弧
  • tailvex弧尾位置,headvex弧头位置,hlink弧头相同的下一条弧,tlink弧尾相同的下一条弧

6.5 图的遍历

数据结构知识_第786张图片
数据结构知识_第787张图片
数据结构知识_第788张图片
数据结构知识_第789张图片

6.5.1 深度优先遍历

数据结构知识_第790张图片

一条路走到底后回退到上一个位置。(最后回退到顶点的位置)

数据结构知识_第791张图片
数据结构知识_第792张图片

数据结构知识_第793张图片

ps:相关实现过程往下翻

数据结构知识_第794张图片
数据结构知识_第795张图片

数据结构知识_第796张图片
起点是2号顶点,因此辅助数字visited[2]=1数据结构知识_第797张图片
访问1顶点
数据结构知识_第798张图片
访问3
数据结构知识_第799张图片
访问5
数据结构知识_第800张图片
访问5时,发现相邻结点均访问过,因此回退到3
访问3时,也都访问过,回退到1
访问4
数据结构知识_第801张图片
访问6
数据结构知识_第802张图片
然后发现均访问过,则一步步往后退
数据结构知识_第803张图片

6.5.2 广度优先遍历

数据结构知识_第804张图片

从起始点开始,访问所有的邻接点,然后再访问邻接点的邻接点。直到所有顶点都被访问。

数据结构知识_第805张图片
数据结构知识_第806张图片
数据结构知识_第807张图片
数据结构知识_第808张图片

数据结构知识_第809张图片
v1入队数据结构知识_第810张图片> v1出队,即访问v1数据结构知识_第811张图片
v1的邻接点v2、v3入队数据结构知识_第812张图片
数据结构知识_第813张图片
数据结构知识_第814张图片
数据结构知识_第815张图片
数据结构知识_第816张图片
数据结构知识_第817张图片
数据结构知识_第818张图片
数据结构知识_第819张图片
数据结构知识_第820张图片

6.6 图的应用

6.6.1 最小生成树

数据结构知识_第821张图片
数据结构知识_第822张图片

数据结构知识_第823张图片
数据结构知识_第824张图片
数据结构知识_第825张图片

此通信网便是生成树。因此解题便需要找到最小生成树。

(1)构造最小生成树MST

数据结构知识_第826张图片
数据结构知识_第827张图片

Prim算法

【点开始:任意取一个点,找连接中最小的边;形成整体后再找最小的边】
【适用于点少、边数多的算法】
数据结构知识_第828张图片

Kruskal算法

【先写出所有顶点,找权值最小的,验证是否构成一个环(若构成一个环,则退回上一步找笔直大一点的环)】
【适用于点多的图】

数据结构知识_第829张图片
数据结构知识_第830张图片
数据结构知识_第831张图片
数据结构知识_第832张图片
若v5v6的权值为5,则有两种
数据结构知识_第833张图片

数据结构知识_第834张图片

6.6.2 最短路径

数据结构知识_第835张图片
数据结构知识_第836张图片
数据结构知识_第837张图片
数据结构知识_第838张图片
数据结构知识_第839张图片

(1)Dijkstra算法…

数据结构知识_第840张图片
数据结构知识_第841张图片
数据结构知识_第842张图片

数据结构知识_第843张图片
数据结构知识_第844张图片
数据结构知识_第845张图片
接下来看v0直接到各个顶点 与 v0经过v2到达各个顶点的 比较,若减少则修改值,若没减少则不变。
(v2找到了最短路径,后面的都不用看了)
数据结构知识_第846张图片
有两个一样的,则选择下标小的那个
数据结构知识_第847张图片
数据结构知识_第848张图片
数据结构知识_第849张图片
数据结构知识_第850张图片

(2)Floyd算法

对角线为0,即不考虑自身的
数据结构知识_第851张图片
数据结构知识_第852张图片
数据结构知识_第853张图片
数据结构知识_第854张图片

6.6.3 拓扑排序

数据结构知识_第855张图片
数据结构知识_第856张图片

数据结构知识_第857张图片
数据结构知识_第858张图片
数据结构知识_第859张图片
数据结构知识_第860张图片

数据结构知识_第861张图片
对如图所示的图进行拓扑排序,可得到如下结果:
(这三个结点均存在前驱,因此不可删除)
不可删除,则证明存在环。
数据结构知识_第862张图片

数据结构知识_第863张图片
数据结构知识_第864张图片
数据结构知识_第865张图片
通常选取下标最小的点
数据结构知识_第866张图片> 数据结构知识_第867张图片
数据结构知识_第868张图片
数据结构知识_第869张图片
数据结构知识_第870张图片
数据结构知识_第871张图片

6.6.4 关键路径

数据结构知识_第872张图片
数据结构知识_第873张图片
数据结构知识_第874张图片

数据结构知识_第875张图片数据结构知识_第876张图片

关键路径就是影响工程进度的关键

数据结构知识_第877张图片

最迟发生时间是需要 所有流程需要时间的

数据结构知识_第878张图片
在这里插入图片描述

数据结构知识_第879张图片

求关键路径步骤

数据结构知识_第880张图片
数据结构知识_第881张图片
数据结构知识_第882张图片
汇点的最迟发生时间与最早发生时间相同
数据结构知识_第883张图片
e(i):a1是从v1到v2,于是查找v1的ve(v1),即0,因此a1的e为0。
数据结构知识_第884张图片
l(i):a1是 从v1到v2,于是查找v2的vl(v1),再减去a1的持续时间(即权值6)。即6-6=0
数据结构知识_第885张图片
计算差值
数据结构知识_第886张图片
差值为0的就是关键活动。
由关键活动构成的路径就是关键路径(蓝色标志)。
数据结构知识_第887张图片

第七章 查找

数据结构知识_第888张图片

7.1 查找的基本概念

数据结构知识_第889张图片
数据结构知识_第890张图片
数据结构知识_第891张图片
数据结构知识_第892张图片
数据结构知识_第893张图片
数据结构知识_第894张图片
数据结构知识_第895张图片

7.2 线性表的查找

7.2.1 顺序查找(线性查找)

数据结构知识_第896张图片

数据结构知识_第897张图片
数据结构知识_第898张图片

数据结构知识_第899张图片
合并后:
数据结构知识_第900张图片
数据结构知识_第901张图片

数据结构知识_第902张图片
数据结构知识_第903张图片
时间效率分析:
在这里插入图片描述

数据结构知识_第904张图片
数据结构知识_第905张图片

7.2.2 折半查找(二分或对分查找)

数据结构知识_第906张图片
数据结构知识_第907张图片

数据结构知识_第908张图片
数据结构知识_第909张图片

数据结构知识_第910张图片
数据结构知识_第911张图片
数据结构知识_第912张图片
数据结构知识_第913张图片

查找过程

  • 假设数的排列是递增的
    数据结构知识_第914张图片
    【情况一 找21】
    数据结构知识_第915张图片
    发现要查找的数比中间数小,于是在左边查找
    数据结构知识_第916张图片
    数据结构知识_第917张图片
    数据结构知识_第918张图片
    (4+5)/2 结果取4
    数据结构知识_第919张图片


    【情况二 找63】
    在这里插入图片描述
    数据结构知识_第920张图片
    数据结构知识_第921张图片
    数据结构知识_第922张图片
    数据结构知识_第923张图片
    数据结构知识_第924张图片

7.2.3 分块查找(索引顺序查找)

数据结构知识_第925张图片
数据结构知识_第926张图片

数据结构知识_第927张图片

块间有序,块内可以无序

数据结构知识_第928张图片

7.2.4 线性表查找方法比较

数据结构知识_第929张图片

7.3 树表的查找

数据结构知识_第930张图片

7.3.1 二叉排序树

数据结构知识_第931张图片
数据结构知识_第932张图片
数据结构知识_第933张图片

(1)二叉排序树存储结构

数据结构知识_第934张图片

(2)查找

数据结构知识_第935张图片
数据结构知识_第936张图片
数据结构知识_第937张图片
数据结构知识_第938张图片
数据结构知识_第939张图片
数据结构知识_第940张图片
数据结构知识_第941张图片

(3)插入

数据结构知识_第942张图片
数据结构知识_第943张图片

(4)生成

数据结构知识_第944张图片
数据结构知识_第945张图片
数据结构知识_第946张图片

(5)删除

数据结构知识_第947张图片
数据结构知识_第948张图片
【如下是删除关键字40和80】
数据结构知识_第949张图片
数据结构知识_第950张图片
数据结构知识_第951张图片
数据结构知识_第952张图片

7.3.2 平衡二叉树

数据结构知识_第953张图片
数据结构知识_第954张图片
数据结构知识_第955张图片
数据结构知识_第956张图片

数据结构知识_第957张图片
数据结构知识_第958张图片

数据结构知识_第959张图片

把中间的数放在第一层,然后最小的放在左边,最大的放在右边。

在这里插入图片描述
数据结构知识_第960张图片
数据结构知识_第961张图片
数据结构知识_第962张图片

数据结构知识_第963张图片

数据结构知识_第964张图片
数据结构知识_第965张图片
数据结构知识_第966张图片
数据结构知识_第967张图片
数据结构知识_第968张图片

在这里插入图片描述
数据结构知识_第969张图片

数据结构知识_第970张图片
数据结构知识_第971张图片
数据结构知识_第972张图片
数据结构知识_第973张图片

数据结构知识_第974张图片

数据结构知识_第975张图片

数据结构知识_第976张图片
数据结构知识_第977张图片

数据结构知识_第978张图片
数据结构知识_第979张图片
数据结构知识_第980张图片
数据结构知识_第981张图片
数据结构知识_第982张图片
数据结构知识_第983张图片
数据结构知识_第984张图片

7.4 哈希表的查找

7.4.1 散列表的基本概念

数据结构知识_第985张图片
数据结构知识_第986张图片

数据结构知识_第987张图片

数据结构知识_第988张图片
数据结构知识_第989张图片

数据结构知识_第990张图片
数据结构知识_第991张图片
数据结构知识_第992张图片

7.4.2 散列函数的构造方法

数据结构知识_第993张图片
数据结构知识_第994张图片
数据结构知识_第995张图片
数据结构知识_第996张图片

(1)直接定址法

数据结构知识_第997张图片

线性函数中 自变量和因变量是一一对应的关系。(就不会有冲突的函数值)

(2)除留余数法

数据结构知识_第998张图片

7.4.3 处理冲突的方法

数据结构知识_第999张图片

(1)开放定址法

数据结构知识_第1000张图片
数据结构知识_第1001张图片

数据结构知识_第1002张图片

数据结构知识_第1003张图片
数据结构知识_第1004张图片

(2)链定址法

数据结构知识_第1005张图片
数据结构知识_第1006张图片
数据结构知识_第1007张图片

7.4.4 散列表的查找

数据结构知识_第1008张图片
数据结构知识_第1009张图片
数据结构知识_第1010张图片
在这里插入图片描述
数据结构知识_第1011张图片
数据结构知识_第1012张图片
数据结构知识_第1013张图片

第八章 排序

数据结构知识_第1014张图片

8.1 基本概念和排序方法概述

数据结构知识_第1015张图片
数据结构知识_第1016张图片
数据结构知识_第1017张图片
数据结构知识_第1018张图片
数据结构知识_第1019张图片

数据结构知识_第1020张图片
数据结构知识_第1021张图片
数据结构知识_第1022张图片
数据结构知识_第1023张图片
数据结构知识_第1024张图片
数据结构知识_第1025张图片
数据结构知识_第1026张图片
数据结构知识_第1027张图片
在这里插入图片描述
数据结构知识_第1028张图片

8.2 插入排序

数据结构知识_第1029张图片
数据结构知识_第1030张图片
数据结构知识_第1031张图片
数据结构知识_第1032张图片
数据结构知识_第1033张图片

8.2.1 直接插入排序

数据结构知识_第1034张图片

  • 若j比x大,则a[j]后移,j–指向前一个元素,再比较
    数据结构知识_第1035张图片
    数据结构知识_第1036张图片
    数据结构知识_第1037张图片
    a[j]小于x则把x插入到 j的下一个位置
    数据结构知识_第1038张图片

数据结构知识_第1039张图片
数据结构知识_第1040张图片

数据结构知识_第1041张图片
数据结构知识_第1042张图片

数据结构知识_第1043张图片

数据结构知识_第1044张图片

8.2.2 折半插入排序

数据结构知识_第1045张图片
数据结构知识_第1046张图片
数据结构知识_第1047张图片
数据结构知识_第1048张图片

8.2.3 希尔排序

数据结构知识_第1049张图片
数据结构知识_第1050张图片
数据结构知识_第1051张图片
数据结构知识_第1052张图片
数据结构知识_第1053张图片
数据结构知识_第1054张图片
数据结构知识_第1055张图片

数据结构知识_第1056张图片

数据结构知识_第1057张图片
数据结构知识_第1058张图片
·
数据结构知识_第1059张图片

8.3 交换排序

数据结构知识_第1060张图片

8.3.1 冒泡排序

数据结构知识_第1061张图片

数据结构知识_第1062张图片
数据结构知识_第1063张图片
数据结构知识_第1064张图片
数据结构知识_第1065张图片
数据结构知识_第1066张图片

数据结构知识_第1067张图片

数据结构知识_第1068张图片

数据结构知识_第1069张图片

数据结构知识_第1070张图片
数据结构知识_第1071张图片

3是因为使用了临时变量,交换赋值了3次。

数据结构知识_第1072张图片

8.3.2 快速排序

数据结构知识_第1073张图片
数据结构知识_第1074张图片

数据结构知识_第1075张图片
数据结构知识_第1076张图片
数据结构知识_第1077张图片
数据结构知识_第1078张图片
数据结构知识_第1079张图片
数据结构知识_第1080张图片

数据结构知识_第1081张图片
数据结构知识_第1082张图片

数据结构知识_第1083张图片
数据结构知识_第1084张图片
数据结构知识_第1085张图片
数据结构知识_第1086张图片
数据结构知识_第1087张图片
数据结构知识_第1088张图片
数据结构知识_第1089张图片
数据结构知识_第1090张图片
数据结构知识_第1091张图片
在这里插入图片描述

8.4 选择排序

8.4.1 简单选择排序

数据结构知识_第1092张图片
数据结构知识_第1093张图片
数据结构知识_第1094张图片

数据结构知识_第1095张图片
在这里插入图片描述

8.4.2 堆排序

数据结构知识_第1096张图片
数据结构知识_第1097张图片
数据结构知识_第1098张图片
数据结构知识_第1099张图片
数据结构知识_第1100张图片
数据结构知识_第1101张图片

数据结构知识_第1102张图片
数据结构知识_第1103张图片
数据结构知识_第1104张图片
数据结构知识_第1105张图片

数据结构知识_第1106张图片
数据结构知识_第1107张图片

数据结构知识_第1108张图片

数据结构知识_第1109张图片
数据结构知识_第1110张图片
数据结构知识_第1111张图片
数据结构知识_第1112张图片

数据结构知识_第1113张图片

数据结构知识_第1114张图片
数据结构知识_第1115张图片
数据结构知识_第1116张图片
数据结构知识_第1117张图片

8.5 归并排序

数据结构知识_第1118张图片
数据结构知识_第1119张图片

数据结构知识_第1120张图片
数据结构知识_第1121张图片
数据结构知识_第1122张图片
数据结构知识_第1123张图片
数据结构知识_第1124张图片
数据结构知识_第1125张图片
数据结构知识_第1126张图片

8.6 基数排序

数据结构知识_第1127张图片

数据结构知识_第1128张图片
数据结构知识_第1129张图片
数据结构知识_第1130张图片

数据结构知识_第1131张图片

数据结构知识_第1132张图片
数据结构知识_第1133张图片

缺点:不是对所有情况都适用

8.7 外部排序

8.8 各种排序的综合比较

8.8.1 时间性能

数据结构知识_第1134张图片
数据结构知识_第1135张图片

8.8.2 空间性能

数据结构知识_第1136张图片

8.8.3 排序的稳定性能

数据结构知识_第1137张图片

8.8.4 关于“排序方法的时间复杂度的下限”

数据结构知识_第1138张图片

你可能感兴趣的:(数据结构,算法)