数据结构概述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
教材:《数据结构》严蔚敏吴伟民清华大学出版社
《数据结构算法实现及解析》高一凡西安电子科技大学出版社
第一部分数据结构概述
一、定义(研究是数据结构的存储和数据的操作的)
如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫做算法。
数据结构= 个体的存储(从某个角度而言,可忽略)+ 个体与个体之间关系的存储(核心)
算法= 对存储数据的操作
二、算法
解题的方法和步骤
衡量算法的标准
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变量所在的函数运行终止时有系统自动释放
⑥跨函数使用内存
静态内存不可以跨函数使用:
静态内存在函数执行期间可以被其它函数使用
静态内存在函数执行完毕之后就不能在被其它函数使用
动态内存可以跨函数使用
动态内存在函数执行完毕之后仍然可以被其它函数使用
第三部分模块一:线性结构[把所有的结点用一条直线穿起来]
一、连续存储[数组]
1.什么叫做数组
元素类型相同,大小相等
2.数组的优缺点(相对于链表)
优点:存取速度快
缺点:实现必须知道数组的长度
需要大块连续的内存块
插入和删除元素很慢
空间通常是有限制的
二、离散存储[链表]
1.定义
N个结点离散分配
彼此通过指针相连
每个结点只有一个前驱结点,每个结点只有一个后续结点
首结点没有前驱结点,尾结点没有后续结点
专业术语:
首结点:第一个存放有效数据的结点
尾结点:最有一个存放有效数据的结点
头结点:头结点的数据类型和首结点的类型是一样的
首结点之前的结点
头结点并不存放有效数据
加头结点的目的是为了方便对链表的操作
头指针:指向头结点的指针变量
尾指针:指向尾结点的指针变量
确定一个链表需要几个参数:
(如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的那些参数)
一个参数,即头指针,因为我们通过头指针可以推算出链表的其它所有的信息
2.分类
单链表
双链表:每一个结点有两个指针域
循环链表:能通过任何一个结点找到其它所有的结点
非循环链表
3.算法
遍历/ 查找/ 清空/ 销毁/ 求长度/ 排序/ 删除结点/ 插入结点
插入结点:(伪算法)
① r = p->pNext; p->pNext = q; q->pNext = r;
② q->pNext = p->pNext; p->pNext = q;(这两行代码不能倒过来)
删除结点:(伪算法)
r = p->pNext; p->pNext = p->pNext->pNext; free(r);
狭义的算法是与数据的存储方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的