- 2_衡量算法的标准
- 3_数据结构的特点.avi
- 4_预备知识_指针_1
- 5_预备知识_指针_2
- 6_所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址
- 7_如何通过函数修改实参的值
- 8_结构体的使用概述
- 9_malloc()动态分配内存概述
- 10_跨函数使用内存讲解及其示例
- 11_复习
- 12_连续存储数组的算法演示_1
- 13_连续存储数组的算法演示_2
- 14_链表的重要性
- 15_typedef的用法
- 16_链表的定义
- 17_如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的哪些参数
- 18_每一个链表节点的数据类型该如何表示的问题
- 19_链表的分类
- 20_非循环单链表插入节点伪算法讲解
- 21_删除非循环单链表节点伪算法的讲解
- 22_学习数据结构的目的和要达到的要求
- 23_复习
- 24_链表创建和链表遍历算法的演示
- 25_判断链表是否为空 和 求链表长度 算法的演示
- 26_通过链表排序算法的演示 再次详细讨论到底什么是算法以及到底什么是泛型【重点】
- 27_如何学习算法自己的一些感想
- 28_链表插入和删除算法的演示
- 29_复习
- 30_栈的定义
- 31_栈的分类
- 32_栈可以执行哪些操作
- 33_栈程序演示
- 34_栈的日常具体应用
- 35 _ 队列1 _ 什么是队列
- 36 _ 队列2 _ 队列的分类 和 链式队列伪算法的讲解
- 37 _ 队列3 _ 学习循环队列必须要弄清楚的7个问题概述
- 38 _ 队列4 _ 静态队列为什么必须是循环队列
- 39 _ 队列5 _ 循环队列需要几个参数来确定 及其含义的讲解
- 40 _ 队列6 _ 循环队列各个参数的含义
- 41 _ 队列7 _ 循环队列入队伪算法讲解
- 42 _ 队列8 _ 循环队列出队伪算法讲解
- 43 _ 队列9 _ 如何判断循环队列是否为空
- 44 _ 队列10 _ 如何判断循环队列是否已满
- 45 _ 复习 _ 求链表的长度
- 46 _ 复习上节课队列知识
- 47 _ 循环队列程序演示
- 48 _ 队列的具体应用
- 49 _ 可以不看
- 50 _ 递归1 _ 递归的定义 和 不同函数之间相互调 程序举例
- 51 _ 递归2 _ 一个函数自己调自己 程序举例
- 52 _ 递归3 _ 1+2+3+....+100之和用递归来实现
- 53 _ 递归4 _ 布置作业_汉诺塔
- 54 _ 递归5 _ 一个函数为什么可以自己调用自己
- 55 _ 递归6 _ 递归必须满足三个条件
- 56 _ 递归7 _ 循环和递归的比较
- 57 _ 递归8 _ 汉诺塔
- 58 _ 递归9 _ 递归的应用
- 59_1线性结构总复习 2线性结构和非线性结构关系 3栈队列链表数组之间的关系【重点】
- 60_树1_树的定义
- 61_树2_树的专业术语解释
- 62_树3_树的分
- 63_树4_二叉树连续存【重点】
- 64_树5_二叉树的链式存储
- 65_树6_普通树的存储
- 66_树7_森林的存储
- 67_树8_二叉树的先序遍历
- 68_树9_二叉树的中序遍历
- 69_树10_二叉树的后序遍历
- 70_树11_已知两种遍历序列求原始二叉树概述
- 71_树12_已知先序和中序求后序
- 72_树13_已知中序和后序求先序
- 73_树14_树的应用简单介绍
- 74_树15_复习上节课知识
- 75_树16_链式二叉树遍历具体程序演示
- 76_树17_5种常用排序概述 和 快速排序详细讲解
- 77_树18_再次讨论什么是数据结构
- 78_树19_再次讨论到底什么是泛型
郝斌老师数据结构视频教程共78集,是由郝斌老师根据多年的教学经验来录制,分享自己的心得。
第一部分 数据结构概述
一、定义(研究是数据结构的存储和数据的操作的)
如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫做算法。
数据结构 = 个体的存储(从某个角度而言,可忽略) + 个体与个体之间关系的存储(核心)
算法 = 对存储数据的操作 二、算法
解题的方法和步骤 衡量算法的标准
1.时间复杂度
大概程序要执行的次数,而非执行的时间
2.空间复杂度
算法执行过程中大概所占用的最大内存
3.难易程度(即可读性) 4.健壮性
三、数据结构的地位
数据结构是软件中最核心的内容
程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言 第二部分 预备知识 一、指针
指针的重要性:指针是C语言的灵魂 定义
地址:内存单元的编号 从零开始的非负整数
范围:0--FFFFFFFF(即0--4G-1) 指针: 指针就是地址,地址就是指针 指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数(只能进行减运算)
分类:
1.基本类型的指针 2.指针和一维数组的关系
二、结构体
为什么会出现结构体
为了表示一些复杂的数据,而普通的基本类型变量无法满足要求 什么叫结构体
结构体是用户根据实际需要自己定义的数据类型 如何使用结构体 两种方式:
struct Student st = {1000, "zhangsan", 20} struct Student * pst = &st; 1.st.sid 2.pst->sid
pst所指向的结构体变量中的sid这个成员注意事项
结构体变量不能加减乘除,但可以相互赋值 普通结构体变量和结构体指针变量作为函数传参问题 三、动态内存的分配和释放
假设动态构造一个int型的一位数组 int len;
int * pArr = (int *)malloc (sizeof(int) * len);
①本语句分配了两块内存,一块内存是动态分配的,总共len个字节;另一块是静态分配的,是pArr变量本身所占的内存,总共4个字节。 ②malloc只有一个int型的形参,表示要求系统分配的字节数
③malloc函数的功能是请求系统分配len个字节的内存空间,如果分配成功,则返回第一个字节的地址,如果分配不成功,则返回NULL
④malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无任何实际意义的第一个字节的地址(俗称干地址)转化为一个有实际意义的地址,因此,malloc函数前面必须加强制类型转换(数据类型 *),表示把这个无实际意义的第一个字节的地址转化为相应类型的地址。 ⑤free(* pArr)
表示把pArr所指向的内存给释放掉
pArr本身的内存是静态的,不能有程序员手动释放,只能在pArr变量所在的函数运行终止时有系统自动释放 ⑥跨函数使用内存
静态内存不可以跨函数使用:
静态内存在函数执行期间可以被其它函数使用 静态内存在函数执行完毕之后就不能在被其它函数使用