2022年2022年郝斌数据结构视频学习总结 .pdf
《2022年2022年郝斌数据结构视频学习总结 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年郝斌数据结构视频学习总结 .pdf(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构资料- 1 - 郝斌数据结构视频学习总结郝斌数据结构视频学习总结 . - 1 - 0 教材 . - 2 - 1 数据结构概述 . - 2 - 1.1、定义(研究是数据结构的存储和数据的操作的). - 2 - 1.2、算法 . - 2 - 1.3、数据结构的地位 . - 2 - 2 预备知识 . - 3 - 2.1、指针 . - 3 - 2.2、结构体 . - 3 - 2.3、动态内存的分配和释放 . - 4 - 3 模块一:线性结构把所有的结点用一条直线穿起来 . - 5 - 3.1、连续存储 数组 . - 5 - 3.1.1 什么叫做数组 . - 5 - 3.1.2.数组的优缺点(相
2、对于链表). - 5 - 3.2、离散存储 链表 . - 5 - 3.2.1.定义及专业术语 . - 5 - 3.2.2.分类 . - 6 - 3.2.3.算法( typedef/动态分配内存实例) . - 6 - 3.2.4.链表的优缺点(相对于数组). - 9 - 3.2.5.小结: . - 9 - 3.3、线性结构的两种常见应用之一栈. - 11 - 3.3.1.定义:一种可以实现“ 先进后出 ” 的存储结构 . - 11 - 3.3.2 分类 . - 11 - 3.3.3.算法 . - 11 - 3.3.4 应用 . - 11 - 3.3.5 栈操作代码 . - 11 - 3.4、线性
3、结构的两种常见应用之一队列 . - 15 - 3.4.1.定义:一种可以实现“ 先进先出 ” 的存储结构 . - 15 - 3.4.2.分类 . - 15 - 3.4.3.算法 . - 16 - 3.4.4 应用及代码 . - 16 - 3.5、专题:递归(使用栈实现的). - 19 - 3.5.1.定义 :一个函数自己直接或间接调用自己. - 19 - 3.5.2.函数的调用前后的准备工作. - 19 - 3.5.3 递归必须满足的三个条件:. - 20 - 3.5.4.循环和递归之间的关系 . - 20 - 3.5.5.举例: . - 21 - 3.5.6.递归的应用 . - 23 - 4
4、 模块二:非线性结构 . - 23 - 4.1、树 . - 23 - 4.1.1.定义及专业术语 . - 23 - 4.1.2.分类 . - 24 - 4.1.3.存储(解决非线性结构用线性结构表示的问题). - 25 - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 35 页 - - - - - - - - - 数据结构资料- 2 - 4.1.4 操作 (重点 ) . - 28 - 4.1.4 应用及代码 . - 31 - 4.2、图(视频中未讲解) . - 34 -
5、 5 模块三:查找和排序 . - 34 - 6、Java中容器和数据结构相关知识(视频中未讲解) . - 35 - 0 教材教材: 数据结构严蔚敏 吴伟民 清华大学出版社数据结构算法实现及解析高一凡 西安电子科技大学出版社1 数据结构概述1.1、定义(研究是数据结构的存储和数据的操作的)如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫做算法。数据结构= 个体的存储(从某个角度而言,可忽略)+ 个体与个体之间关系的存储(核心)算法 = 对存储
6、数据的操作1.2、算法解题的方法和步骤衡量算法的标准时间复杂度大概程序要执行的次数,而非执行的时间空间复杂度算法执行过程中大概所占用的最大内存难易程度(即可读性)健壮性1.3、数据结构的地位数据结构是软件中最核心的内容名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 35 页 - - - - - - - - - 数据结构资料- 3 - 程序 = 数据的存储+ 数据的操作+ 可以被计算机执行的语言2 预备知识2.1、指针指针的重要性:指针是C 语言的灵魂定义:地址:内存单元的
7、编号从零开始的非负整数范围: 0-FFFFFFFF(即 0-4G-1)指针:指针就是地址,地址就是指针指针变量是存放内存单元地址的变量指针的本质是一个操作受限的非负整数(只能进行减运算)分类:1.基本类型的指针2.指针和一维数组的关系2.2、结构体为什么会出现结构体为了表示一些复杂的数据,而普通的基本类型变量无法满足要求什么叫结构体结构体是用户根据实际需要自己定义的数据类型如何使用结构体两种方式:struct Student st = 1000, zhangsan, 20 struct Student * pst = &st; 1.st.sid 2.pst-sid pst 所指向的结构体变量中
8、的sid 这个成员注意事项名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 35 页 - - - - - - - - - 数据结构资料- 4 - 结构体变量不能加减乘除,但可以相互赋值普通结构体变量和结构体指针变量作为函数传参问题2.3、动态内存的分配和释放假设动态构造一个int 型的一位数组int len;int * pArr = (int *)malloc (sizeof(int) * len); 本语句分配了两块内存,一块内存是动态分配的,总共len 个字节;另一块是
9、静态分配的,是 pArr 变量本身所占的内存,总共4 个字节。malloc 只有一个 int 型的形参,表示要求系统分配的字节数malloc 函数的功能是请求系统分配len 个字节的内存空间, 如果分配成功, 则返回第一个字节的地址,如果分配不成功,则返回NULL malloc 函数能且只能返回第一个字节的地址,所以我们需要把这个无任何实际意义的第一个字节的地址(俗称干地址)转化为一个有实际意义的地址,因此,malloc 函数前面必须加强制类型转换(数据类型*) ,表示把这个无实际意义的第一个字节的地址转化为相应类型的地址。free(* pArr )表示把 pArr 所指向的内存给释放掉pAr
10、r 本身的内存是静态的, 不能有程序员手动释放, 只能在 pArr 变量所在的函数运行终止时有系统自动释放跨函数使用内存静态内存不可以跨函数使用:静态内存在函数执行期间可以被其它函数使用静态内存在函数执行完毕之后就不能在被其它函数使用动态内存可以跨函数使用动态内存在函数执行完毕之后仍然可以被其它函数使用,除非使用 free()方法释放动态非配的内存名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 35 页 - - - - - - - - - 数据结构资料- 5 - 3 模块
11、一:线性结构把所有的结点用一条直线穿起来 3.1、连续存储 数组 3.1.1 什么叫做数组元素类型相同,大小相等确定一个数组需要三个参数:数组大小,数组有效存储量,数组首地址3.1.2. 数组的优缺点(相对于链表)优点:存取速度快缺点:实现必须知道数组的长度需要大块连续的内存块插入和删除元素很慢空间通常是有限制的3.2、离散存储 链表 3.2.1. 定义及专业术语N 个结点离散分配彼此通过指针相连每个结点只有一个前驱结点,每个结点只有一个后续结点首结点没有前驱结点,尾结点没有后续结点专业术语:首结点:第一个存放有效数据的结点尾结点:最后一个存放有效数据的结点头结点:头结点的数据类型和首结点的类
12、型是一样的首结点之前的结点头结点并不存放有效数据加头结点的目的是为了方便对链表的操作头指针:指向头结点的指针变量尾指针:指向尾结点的指针变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 35 页 - - - - - - - - - 数据结构资料- 6 - 确定一个链表需要几个参数:(如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的那些参数)只需要一个参数,即 头指针 ,因为我们通过头指针可以推算出链表的其它所有的信息typedef 为数据类型起别名:3.2.
13、2. 分类单链表双链表:每一个结点有两个指针域循环链表:能通过任何一个结点找到其它所有的结点非循环链表3.2.3. 算法( typedef/ 动态分配内存实例)遍历 / 查找 / 清空 / 销毁 / 求长度 / 排序 / 删除结点/ 插入结点插入结点: (伪算法 ) r = p-pNext; p-pNext = q; q-pNext = r; q-pNext = p-pNext; p-pNext = q;(这两行代码不能倒过来 ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6
14、页,共 35 页 - - - - - - - - - 数据结构资料- 7 - 删除结点:(伪算法)r = p-pNext; p-pNext = p-pNext-pNext; free(r); /释放所删除结点的内存,因为C 中不能自动回收垃圾名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 35 页 - - - - - - - - - 数据结构资料- 8 - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名
15、师精心整理 - - - - - - - 第 8 页,共 35 页 - - - - - - - - - 数据结构资料- 9 - 排序: 3.2.4. 链表的优缺点(相对于数组)优点:空间没有限制插入和删除元素很快缺点:存取的速度很慢3.2.5. 小结:数据结构狭义:数据结构是专门研究数据存储的问题数据的存储包含两个方面:个体的存储+ 个体关系的存储广义:数据结构既包含数据的存储也包含数据的操作对存储数据的操作就是算法算法狭义:算法是和数据的存储方式密切相关广义:算法和数据的存储方式无关这就是泛型思想泛型:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
16、 - - - - - 名师精心整理 - - - - - - - 第 9 页,共 35 页 - - - - - - - - - 数据结构资料- 10 - 利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的同一种逻辑结构(包括线性结构和非线性结构,其中非线性结构包括树和图),无论该逻辑结构物理存储(包括数组和链表)是什么样子的,我们都可以对它执行相同的操作数据的存储结构有几种线性:数组连续存储优点:存取速度很快缺点:事先必须知道数组的长度插入删除元素很慢空间通常是有限制的需要大块连续的内存块链表离散存储优点:空间没有限制插入、删除元素很快缺点:存取速度很慢线性结构的应用栈线性结构的应用
17、队列非线性:树图#include #include void f(int i) int m; double *q = (double *)malloc(sizeof(doule); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 35 页 - - - - - - - - - 数据结构资料- 11 - int main(void) int i=10; int * p = (int *) malloc(200) ;return 0; 3.3、线性结构的两种常见应用之一栈3.
18、3.1. 定义:一种可以实现 “ 先进后出 ” 的存储结构栈类似于箱子3.3.2 分类静态栈:以数组为内核动态栈:以链表为内核 (最常用 ) 3.3.3. 算法出栈 / 入栈3.3.4 应用函数调用/ 中断 / 表达式求值/内存分配/ 缓冲处理/ 迷宫3.3.5 栈操作代码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 35 页 - - - - - - - - - 数据结构资料- 12 - /链式 动态栈#include #include #include typede
19、f struct Node int data; Node * pNext; NODE,*PNODE; typedef struct Stack PNODE pTop;/压入、弹出操作均在pTop一端进行PNODE pBottom;/不存储有效数据,仅仅作为记录STACK, *PSTACK; void init(PSTACK); void push(PSTACK,int); bool pop(PSTACK,int *); void clear(PSTACK); void travese(PSTACK); pTop pBottom 不 存 储 有效数据压 栈 、 出栈 均 在 此位置名师资料总结
20、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 35 页 - - - - - - - - - 数据结构资料- 13 - int main(void) STACK s; int val; init(&s); push(&s,1); push(&s,6); travese(&s); clear(&s); travese(&s); push(&s,2); push(&s,7); travese(&s); if(pop(&s,&val) printf(pop success! pop: %d
21、,val); printf(n); else printf(pop fail!) ; printf(n); travese(&s); return 0; /初始化栈void init(PSTACK pStack) PNODE pNew = (PNODE)malloc(sizeof(NODE); if(NULL = pNew) printf( 动态分配内存失败 ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 35 页 - - - - - - - - - 数据结构资料
22、- 14 - pNew-pNext = NULL; pNew-data = -123456; pStack-pTop = pNew; pStack-pBottom = pNew; /压入操作void push(PSTACK pStack,int val) PNODE pNew = (PNODE)malloc(sizeof(NODE); pNew-data = val; pNew-pNext = pStack-pTop; pStack-pTop = pNew; /遍历操作void travese(PSTACK pStack) PNODE pRec = pStack-pTop;/ 遍历时不能改变
23、pTop的值。while(pRec != pStack-pBottom) printf(%d ,pRec-data); pRec = pRec-pNext; printf(n); /弹出操作bool pop(PSTACK pStack,int *pVal) if(pStack-pTop != pStack-pBottom) PNODE temp = pStack-pTop; *pVal = temp-data; pStack-pTop = temp-pNext; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
24、- - - - - - 第 14 页,共 35 页 - - - - - - - - - 数据结构资料- 15 - free(temp); return true; else return false; /清空操作void clear(PSTACK pStack) PNODE temp = NULL; while(pStack-pTop != pStack-pBottom) temp = pStack-pTop; pStack-pTop = temp-pNext; free(temp); 3.4、线性结构的两种常见应用之一队列3.4.1. 定义:一种可以实现 “ 先进先出 ” 的存储结构队列类似
25、于排队买票3.4.2. 分类链式队列- 用链表实现front(从这端出队 ) ,rear(从这端入队 ) 静态队列- 用数组实现静态队列通常都必须是循环队列循环队列的讲解:静态队列为什么必须是循环队列普通数组队列的参数front 和 rear只增不减,导致空余部分的内存浪费名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 35 页 - - - - - - - - - 数据结构资料- 16 - 循环队列需要几个参数来确定需要两个参数: front / rear 循环队列各个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年郝斌数据结构视频学习总结 2022 年郝斌 数据结构 视频 学习 总结
限制150内