数据结构笔记(郝斌主讲)(2015-11-8 00:57:45更新)

教材-课外书籍推荐

高一凡(伪算法→真代码)

数据结构概述
 定义
  我们如何把现实生活中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法

数据结构 = 个体 + 个体的关系
  算法 = 对存储数据的操作

算法
  解题的方法和步骤

衡量算法的标准
   1.时间复杂度
    大概程序要执行的次数,而非执行的时间
   2.空间复杂度
    算法执行过程中大概所占用的最大内存
   3.难易程度

4.健壮性

数据结构的地位
  数据结构是软件中最核心的课程

程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言

最后编辑于2015年8月18日23:10:06

预备知识
  指针
   指针的重要性:
    指针是C语言的灵魂
   定义
    地址
     地址就是内存单元的编号
     从0开始的非负整数
     范围: 0--FFFFFFFF(0——4G-1)

指针:
     指针就是地址,地址就是指针
     指针变量是存放内存单元地址的变量
     指针的本质是一个操作受限的非负整数

分类:
    1.基本类型的指针

2.指针和数组的关系

最后编辑于2015年8月19日23:06:51

结构体
  为什么会出现结构体
   为了表示一些复杂的数据,而普通的基本类型变量无法满足要求

什么叫结构体
   结构体是用户根据实际需要自己定义的复合数据类型

如何使用结构体
   两种方式
   struct Student  st = {1000, "zhangsan", 20};
 
   struct Student * pst;

1.
    st.sid
   2.
    pst->sid
    pst所指向的结构体变量中的sid这个成员

注意事项
   结构体变量不能加减乘除,但可以相互赋值
   普通结构体变量和结构体指针变量作为函数传参的问题

跨函数使用内存---通过动态内存分配实现
 一般情况下,自定义函数结束后内存释放,唯有动态分配的内存在没有遇见free函数的情况下,自定义函数结束了,但内存仍然存在。

最后编辑于2015年8月20日23:00:44

模块一:线性结构[把所有的结点用一根直线穿起来]
连续存储[数组]
1. 什么叫数组
元素类型相同,大小相同
2. 数组的优缺点

离散存储[链表]
定义:
n个结点离散分配
彼此通过指针相连
每个节点只有一个前驱节点,每个节点只有一个后续节点
首节点没有前驱结点,尾节点没有后续节点

专业术语:
首节点:
第一个有效节点
尾节点:
最后一个有效节点
头结点:
头结点是数据类型和首结点类型一样
第一个有效节点之前的那个节点
头结点并不存放有效数据
加头结点的目的主要是为了方便对链表的操作
头指针:
指向头结点的指针变量
尾指针:
指向尾节点的指针变量

如果希望通过一个函数对链表进行处理,我们至少需要接受链表的哪些信息:
只需要一个参数:头指针
因为我们通过头指针可以推算出链表的其他所有信息

分类:
单链表
双链表:
每一个节点有两个指针域

循环链表
能通过任何一个节点找到其他所有的结点
非循环链表
算法:
遍历
查找
清空
销毁
求长度
排序
删除节点
插入节点
算法:
狭义的算法是与数据的存储方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的

链表排序算法

 1 for(i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext)
 2     {
 3         for(j=i+1,q=p->pNext; j<len; ++j,q=q->pNext)
 4         {
 5             if(p->data >  q->data)//类似于数组中的 a[i] > a[j]
 6             {
 7                 t = p->data;//类似于数组中的:t = a[i];
 8                 p->data = q->data;//类似于数组中的:a[i] = a[j];
 9                 q->data = t;//类似于数组中的 a[j] = t;
10             }
11         }
12     }

再论数据结构
  狭义:
    数据结构是专门研究数据存储的问题
    数据的存储包含两方面:个体的存储 + 个体关系的存储
  广义:
    数据结构既包含数据的存储也包含数据的操作
    对存储数据的操作就是算法
算法:
  狭义
    算法是和数据的存储方式密切相关
  广义
    算法和数据的存储方式无关
    这就是泛型思想
数据的存储结构有几种
  线性
  连续存储【数组】
    优点
      存储速度很快
    缺点
      事先必须知道数组的长度
      插入删除元素很慢
      空间通常是有限制的
      需要大块连续的内存块
      插入删除的效率极低

  离散存储【链表】
   优点
    空间没有限制
    插入删除元素很快

   缺点
    存取速度很慢

线性结构的应用--栈

线性结构的应用--队列

非线性

链表的优缺点:

线性结构的两种常见应用之一 栈
定义
一种可以实现“先进后出”的存储结构
栈类似于箱子

分类
静态栈
动态栈

算法
出栈
压栈

应用

线性结构的两种常见应用之二 队列

定义:
一种可以实现“先进先出”的存储结构
分类:
链式队列 -- 用链表实现

静态队列 -- 用数组实现
静态队列通常都必须是循环队列

循环队列的讲解:
1.静态队列为什么必须是循环队列吧
2.循环队列需要几个参数来确定
需要2个参数来确定
front
rear

3.循环队列各个参数的含义
2个参数不同场合有不同的含义
建议初学者先记住,然后慢慢体会
1).队列初始化
font和rear的值都是零
2).队列非空
font代表的是队列的第一个元素
rear代表的是队列的有效元素的最后一个有效元素的下一个元素
3).队列空
font和rear的值相等,但不一定是零
4.循环队列入队伪算法讲解

两步完成:
1.将值存入r所代表的位置
2.错误的写法rear = rear + 1;
正确的写法是:rear = (rear + 1) % 数组的长度

5.循环队列出队伪算法讲解

front = (front+1) % 数组的长度
6.如何判断循环队列是否为空

如果front与rear的值相等,
则该队列就一定为空

7.如何判断循环队列是否已满

预备知识:

front的值可能比rear大,

front的值也可能比rear小,

当然也可能两者相等

两种方式

1.多增加一个表标识参数

2.少用一个元素[通常使用第二种方式]

如果r和f的值紧挨着,则队列已满

用C语言伪算法表示就是:

if((r+1)%数组的长度==f)

已满

else

不满

不满

队列算法

入队

出队

队列的具体应用:

所有时间和有关的操作都有队列的影子

专题:递归

定义:

一个函数自己直接或间接调用自己

递归满足三个条件

1.递归必须得有一个明确的终止条件

2.该函数所处理的数据规模必须在递减

3.这个转化必须是可解的

循环和递归

递归:

易于理解

速度慢

存储空间大

循环:

不易理解

速度快

存储空间小

举例:

1. 求阶乘

2.  1+2+3+4+……100的和

3. 汉诺塔

4. 走迷宫

时间: 2024-08-09 14:37:41

数据结构笔记(郝斌主讲)(2015-11-8 00:57:45更新)的相关文章

数据结构笔记(郝斌主讲)(9月21日更新)

教材-课外书籍推荐 高一凡(伪算法→真代码) 数据结构概述 定义  我们如何把现实生活中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法 数据结构 = 个体 + 个体的关系  算法 = 对存储数据的操作 算法  解题的方法和步骤 衡量算法的标准   1.时间复杂度    大概程序要执行的次数,而非执行的时间    2.空间复杂度    算法执行过程中

数据结构笔记(郝斌主讲)(8月21日更新)

教材-课外书籍推荐 高一凡(伪算法→真代码) 数据结构概述 定义  我们如何把现实生活中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法 数据结构 = 个体 + 个体的关系  算法 = 对存储数据的操作 算法  解题的方法和步骤 衡量算法的标准   1.时间复杂度    大概程序要执行的次数,而非执行的时间    2.空间复杂度    算法执行过程中

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径 本篇名言:"富贵不淫贫贱乐 ,男儿到此是豪雄.-- 程颢" 这次来看下有向无环图的另一个应用关键路径. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135061 1.  关键路径 与AOV-网相对应的是AOE-网(Activity On Edge)即边表示活动的网.AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活动,权表

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1:

18、蛤蟆的数据结构笔记之十八链表实现稀疏矩阵

18.蛤蟆的数据结构笔记之十八链表实现稀疏矩阵 本篇名言:"必须如蜜蜂一样,采过许多花,才能酿出蜜来." 上篇中实现了栈在多项式实现中的例子,再来看下稀疏矩阵通过链表方式实现. 关键字:十字链表存储 欢迎转载,转载请标明出处: 1.  十字链表存储 十字链表(OrthogonalList)是有向图的另一种链式存储结构.该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的.用十字链表来存储有向图,可以达到高效的存取效果.同时,代码的可读性也会得到提升. 为便于理解后续代码,从网上摘了

2015.11.17 新起点,出发。

今天注册了博客,要开始认真仔细的学习前端技术了.这个博客将作为我学习进度记录.学习笔记整理.心得体会整理等书写记录的工具. —希望苍天不负有心人 2015.11.17

谢谢,郝斌老师;再见,郝斌老师。

现在是一名大一学生,在一所还算理想的大学里,有时上进,更多还是浑浑噩噩的过去了. 看郝斌老师的课让我想起了最开心的初中时光.努力教学的老师,一帮有打有闹的同学,虽然当时我实在非常叛逆,(我初中属于那种老师眼里的刺头),但我很喜欢那种同学之间有说有笑,相互打闹,在教室里面追逐的感觉.老师始终都是严厉的管教者,呵斥之下满满的都是让我们能感觉到的爱意.就在这种随时都有可能引爆老师的氛围之下我却悠然自得很是享受. 听郝斌老师的课让我仿佛又重新回到了那个时光,我又重新拥有了那样的同学与老师,当然老师的讲课

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先 本篇名言:"生活真象这杯浓酒 ,不经三番五次的提炼呵 , 就不会这样一来可口 ! -- 郭小川" 继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275 1.  原理 首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的