一、结构体
1、定义
用户自己定义的数据类型
2、语法
2.1.1
struct 【结构体名】{
数据类型 成员变量1;
数据类型 成员变量2;
...
}
2.1.2
typedef struct 【结构体名】{
数据类型 成员变量1;
数据类型 成员变量2;
...
}【结构体重命名】;//之后可以用结构体重命名代替 struct 【结构体名】
2.2
【结构体重命名】+ 【结构体变量名】 = {.成员变量1 = ,.成员变量2 = ,...}//定义结构体变量并初始化
2.3
【结构体重命名】 + 【结构体变量名】. 【结构体成员变量】//访问结构体成员变量
2.4
【结构体重命名】 + *【指针变量名】= 【结构体变量的地址】 //定义结构体指针变量
2.5
【指针变量名】->【结构体成员】== *【指针变量名】.[结构体成员]//访问结构体指针所指向的结构体变量的成员
二、malloc()/free()函数
1、malloc函数
1.1功能
在堆区申请空间
1.2头文件
#include <stdlib.h>
1.3参数与返回值
形参为给结构体开辟空间的大小,一般使用sizeof求结构体大小
返回值为void * 指针类型,所以使用时需要强转为要开辟空间的结构体指针类型
2、free函数
2.1功能
释放推区申请的空间
2.2头文件
#include <stdlib.h>
2.3参数与返回值
形参为结构体变量地址,一般用结构体指针
无返回值
特别注意:在堆区手动开辟的空间,到使用结束后一定要释放,同时将结构体指针指向空。未释放空间会造成内存泄漏。释放后未将结构体指针指向空,可能会造成非法访问。
三、数据结构基础知识
1、概念
数据结构研究数据与数据之间的关系,分为逻辑关系、存储关系、运算关系。
1.1
逻辑关系:线性关系和非线性关系。//如果一个元素或节点只有一个前驱和一个后继就称为线性关系
存储关系:顺序存储和链式存储。//顺序存储用数组实现,在内存空间连续存储。链式存储用指针实现,在内存空间不连续存储。
运算关系:元素或节点的增加,删除、修改、查找,排序。
2、三种数据结构
2.1表结构-每一行叫做一个元素或记录,元素与元素之间满足逻辑线性
逻辑关系:线性
存储关系:顺序存储--顺序表
链式存储--链表
运算关系:增加,删除、修改、查找,排序
2.2树结构--每一个元素叫节点,每一个节点有且只有一个前驱,可以有多个后继
逻辑关系:非线性
存储关系:顺序存储
链式存储--二叉树
运算关系:遍历
2.3图结构--每个节点可以有多个前驱,多个后继
逻辑关系:非线性
存储关系:顺序存储
链式存储
运算关系:遍历
3、算法
3.1概念
算法与程序的区别:
算法的设计依赖逻辑,与程序无关
算法的实现为程序
3.2算法的特点
有穷性:算法执行的步骤是有限的
确定性:每个计算步骤无二义性
可行性:每个计算步骤能够在有限的时间内完成
输入:算法可以有零个或多个输入
输出:算法至少有一个输出
3.3时间复杂度
算法的时间复杂度指算法中可执行语句的频度之和,用T(n)表示。//算出算法中每个语句的频度,相加得到时间复杂度。当n趋于无穷大时,T(n)与时间复杂度的数量级同阶无穷大,记T(n) =O(时间复杂度的数量级)
特别注意:计算语句频度时,例如二维数组的遍历会进行两次for循环,第一次for循环会变判断n是否大于临界值才退出,因此实际上语句执行了n+1次。第二次for循环因为第一次for,循环体要循环n次,第二次for本身又会执行n+1次语句所以语句频度为n*(n+1)。
3.4
一个好的算法需要满足:
时间复杂度低
空间复杂度低
容易理解、容易编程和调试、容易维护