研究非数据计算的学科,专注于数据的关系及操作
*程序=数据结构+算法
-
数据结构的基本概念
数据:所有能输入到计算机中的描述客观事物的符号
数据项:有独立含义的数据的最小单位 描述事物的一项指标 (形容人:年龄,身高之类)
数据元素:数据的基本单位,也叫节点或记录 描述一个事物(一个人)
数据结构:数据元素+数据关系组成的集合(一个班)
算法:
狭义:数据结构所具有的功能
广义:解决问题的方法 -
数据结构3方面
数据的逻辑结构
数据的存储结构
数据结构的算法 -
四种基本的逻辑结构(逻辑结构)
集合:数据元素之间除了同属一个集合外,没有其他关系
线性结构:数据元素之间存在一对一关系(类似数组下标与元素对应)
数组、链表、功能受限的表(栈(管理方式)、队列)
树型结构:数据元素之间存在一对多关系
普通树、二叉树(完全、满、有序二叉树)
图(地图)形结构:数据元素之间存在多对多关系(树型结构的一种扩展)
阾接表、表的遍历(深度优先、广度优先)、最短路径 -
数据结构的存储方式(物理结构)
顺序存储
数据存储在一段连续的空间,用数据元素在存储器的位置来表示数据元素的关系
优点:能随机访问,效率高,不易产生内存碎片
缺点:空间利用率低,对内存要求高(必须是整块内存),元素添加删除不方便
链式结构(非顺序)
结构中的每一个元素存储在彼此独立的空间中,每一个元素中增加一个或多个数据项用来存放另外一个元素的地址(指针),用来表示数据元素之间的关系
优点:插入删除方便,空间利用率高,对内存要求低
缺点:不能随机访问只能逐个遍历,查找效率低,易产生内存碎片注意:每一种逻辑结构采用什么物理结构实现,没有明确规定。通常根据实现的难度以及在时间空间的要求,再选合适的物理结构。可能是顺序和链式混合存储
-
数据结构与存储结构的关系
表:顺序/链式
树:顺序/链式
图:顺序和链式混合
每种逻辑结构用什么物理结构存储没有规定,通常根据难易程度、时间和空间上的要求,选择最合适的存储物理结构。 -
数据结构的运算
1、创建
2、销毁
3、加元素
4、删除元素
5、修改元素
6、查找元素
7、排序
8、遍历
9、访问
表:
顺序表(存储结构)
1、设计数据结构
2、分析所具备的算法
3、分析算法
4、使用算法
链式表(存储结构)(/数据结构与算法/队列/链式队列/list.c old_list.c new_list.c)
m每个元素都独立存储在内存中的任意位置,元素之间有指针指向来维护关系(元素中有一个数据域指针,指向自己的类型)。
功能受限的表
栈(逻辑结构)
限制为只有一个端口进出元素(先进后出),一般常用于表达式解析,内存管理。(为函数的调用提供支持)
顺序栈(/数据结构与算法/栈顺序栈/is_pop.c) 容量有限
链式栈 容量理论上可以无限(受制于电脑内存)
队列(逻辑结构)
限制为两端进出元素,一个管进,一个管出(先进先出)
顺序对列(/数据结构与算法/队列/顺序队列/queue.c)
链式队列
链式栈
创 销毁 入栈 出 栈空 栈顶
链式队列
创 销毁 入队 出队 查看队头 查看队尾 对空
函数指针
函数就是一段数据(由代码编译的二进制指令),存储在代码段中
函数名就是指向这段数据的指针,可以把我函数指针当做参数在函数之间传递
void qsort(void* base,size_t nmemb,size_t size,
int(compar)(const void,const void*))
base 数组的首地址
nmemb 数组大小
size 数组字节
通用链表
void* 万能指针,可与任意类型指针转换
存储数据地址
void*不能直接解引用
注意:由于储存的类型不确定,所以类型的运算规则不确定,但需要运算时,需要使用者提供运算。这叫回调
标准库的qsort函数就是回调