[考研笔记] 991数据结构C语言最终总结
前言
今天是2021年12月20日,距离考研还有5天。根据之前做的教材习题、历年真题以及去年的全真模拟,最后再进行一次综合性总结;
大部分内容提炼至 [考研笔记] 数据结构、1.1 C 语言基础、1.2 C 语言进阶、1.4.3 指针与引用;
文章基本是给自己看的,结构就会比较杂乱了。
目录
1 数据结构真题分析
2 数据结构知识点
3 数据结构算法设计
4 C 语言真题分析
5 C 语言知识点
6 C 语言程序设计
7 关于 2021 991 真题
[考研笔记] 991 数据结构 C 语言最终总结
1 数据结构真题分析
2 数据结构基础知识
2.1 基本概念类
2.1.1 数据结构基础
逻辑结构:是数据元素之间所存在的逻辑关系;
物理结构:是数据结构在计算机中的存储方式(映像);
两者关系:逻辑结构独立于存储结构;物理结构是逻辑结构的映像;
2.1.2 线性表系列
线性表:是具有相同数据类型的 n 个数据元素的有限序列;
顺序表:是线性表的顺序存储结构,用一组地址连续的存储单元存储数据;
链表:是线性表的链式存储结构,用一组任意的存储单元存储数据;
栈:是一种运算受限的线性表,只允许在一端进行插入或删除操作;
队列:是一种运算受限的线性表,只允许在一端插入、另一端删除;
2.1.3 树系列
二叉树:是度不大于 2 的有序树,即每个结点至多 2 棵子树,且有左右之分;
线索二叉树:在二叉树的基础上在叶子结点的空指针加上结点前驱或后继,以便于遍历二叉树;
二叉排序树:是满足任意结点的左子树所有结点权值小于该结点、右子树大于该结点的二叉树;
哈夫曼树:树中所有叶子结点带权路径长度之和最小的树;
2.1.4 图系列
完全图:是任意两点之间都存在边(或两条方向相反的弧)的图;
子图:边集与点集均为另一个图的子集的图(不强调是图则不一定是子图);
(强)连通分量:即极大(强)连通子图,对于(强)连通图来说即其自身;
最小生成树:包含全部顶点的极小连通子图;
AOV 网:建立在 DAG 上的用点表示活动、用弧表示活动优先级的网;
AOE 网:建立在 DAG 上的用点表示事件、用弧表示活动的网;
关键路径:具有最大路径长度(路径各个活动所需时间之和)的路径;
2.1.5 查找
顺序文件:物理结构与逻辑结构记录排列先后次序一致的文件;
索引查找:利用索引表进行的查找方法,索引记录了关键字值与记录的存储位置之间的对应关系;
散列查找:通过对元素的关键字值进行散列函数运算,直接求出元素的地址,而不需反复比较的查找方法;
2.2 性质类
顺序表是一种随机存取的结构,存储密度大;
最适合做队列的链表结构是单向循环链表;
更适合做队列的链表结构是带头指针、尾指针的单向非循环链表;
循环队列不会出现假溢出情况;
二叉排序树的中序遍历严格单调递增;
散列查找效率取决于:散列函数的定义、冲突的处理方法、装填因子大小(记录数 / 表长)
m 阶 B- 树(多路平衡查找树)是一棵 m 叉树,结点最多有 m 个子结点,最多有 m - 1 个关键字;根结点最少有 2 个,其他非叶子结点最少有 m / 2 个;
B+ 树有 n 个关键字的结点有 n 个子结点,叶子结点数 = 记录数,有两个入口;
2.3 方法论
2.3.1 求关键路径
拓扑序求出各事件最早发生时间 ve(最长路径长度);
逆拓扑序求出各事件最晚发生时间 vl;
各活动最早发生时间 e 等于起点事件的最早发生时间;
各活动最晚发生时间 l 等于终点事件的最晚发生时间减去活动时间 w;
所有 e = l 的活动为关键活动,构成关键路径。
2.3.2 判断是否为折半判定树
将有序序列按中序遍历填入判定树中,观察取整方式是否一致;
2.3.3 B- 树的插入与删除
插入:从最底层(不包括外部结点)插入,如果导致溢出,即关键字个数超过 m - 1,则取最中间关键字上移至父结点,划分出的两部分分别放在原结点和新结点,并保持 B- 树的性质,依次递归直到不出现溢出或者到根结点为止;
删除:如果被删关键字所在结点为叶子结点,且关键字个数 < m / 2,则将个数 >= m / 2 的兄弟结点邻近关键字上移至父结点,父结点同侧关键字下放替补被删关键字,这样结点个数是不变的;如果不存在这样的兄弟结点,则只有下放操作,这样就会删除一个结点。
2.3.4 堆积的插入与删除
插入:插入结点到最后位置,开始向上调整:如果结点大于父结点,则交换,以此类推直到满足堆积性质;
删除:删除根结点后将最后一个结点与根结点交换,开始向下调整:每次选择子结点的较大值进行交换,以此类推直到满足堆积性质;
堆积序列??
2.4 比较类
2.4.1 顺序存储与链式存储
略
2.4.2 顺序存储与一维数组
相同点:使用连续地址存储,支持随机存取;
不同点:数组只能存取元素;线性表长度可变;
2.4.3 排序方法
平均时间复杂度:插入 = 冒泡 = 选择(O(n ^ 2))> 堆积 = 归并 = 快速(O(n log n))
空间复杂度:归并(O(n))> 快速(O(n log n))> 其他(O(1))
稳定性:插入、冒泡、归并稳定;希尔、快速、选择、堆积不稳定;
2.5 分类及其他
物理结构分类:顺序存储、链式存储、索引存储、散列存储;
数据结构三要素:逻辑结构、存储结构、算法(定义+实现);
算法五大特性:有穷性、确定性、有效性、输入、输出;
好的算法的目标:正确性、可读性、健壮性、效率、低存储量需求;
卡特兰数:C(n, 2n) / (n + 1);
散列函数构造:直接定址法、除留余数法(素数)等;
冲突处理方法:开放定址法(线性探测再散列(造成聚集)、二次、伪随机)、再散列、链地址;
3 数据结构算法设计
3.1 后序遍历非递归算法
4 C 语言真题分析
5 C 语言知识点
5.1 常考运算符优先级
高优先级:()、->、前自增自减;!、寻址、取址、后自增自减;
中优先级:乘除;加减;左移右移;比较运算符;
低优先级:与;异或;或;逻辑和;逻辑或;
最低优先级:逗号。
5.2 文件函数
5.2.1 指针放前面
fscanf/fprintf(fp, "...", ...); 格式化读写文件;
fseek(fp, offset, SEEK_SET/CUR/END(0/1/2)); 改变文件位置标记;
5.2.2 指针放后面
fgetc(fp); fputc(ch, fp); 读写字符;
fgets(str, n, fp); fputs(str, fp); 读写字符串;
fread/fwrite(buffer, size, count, fp); 二进制读写文件;
5.2.3 其他
rewind(); 使文件位置标记指向开头;
ftell(); 返回当前文件位置标记的位置;
feof(fp); 判定文件是否结束;
5.3 指针
指针数组/函数本质是数组/函数,声明时不用括号,比如 int *p[2], int *q(int);
数组/函数指针本质是指针,声明时需要括号,比如 int (*p)[2], int (*q)(int)。
5.4 其他
共用体:所有数据成员共用一片内存地址;每次只有一个成员起作用;定义时不能初始化;
全局变量和局部变量:局部变量是指在某个语句块(类、函数等)中内部定义的变量和函数参数,只能在块中使用;全局变量有效范围从文件中定义位置开始到文件结束;
函数数据传递:参数传递;全局变量;函数返回值;
主函数参数:argc 用来统计命令行参数个数,argv 用来存放参数字符串;
预处理指令:是在真正编译开始之前由编译器调用的独立程序指令;
头文件:调用库功能;加强类型安全检查;<> 适用于工程或标准头文件;"" 适用于自定义头文件;
宏定义:用于定义一个标识符常量或带参的宏,本质上是一种文本替换;
字符数组不能被直接赋值,必须使用 strcmp。
6 C 语言程序设计
6.1 文件模板
6.2 交换函数的位运算模板
void swap(int &a, int &b) { a ^= b ^= a ^= b;
7 关于 2021 991 真题
很大区别于往年(2020年真题未知),无论是数据结构还是 C 语言,综合题中都出现大量需要写代码的题,并且出题不像往年那么死板;
数据结构的简答题连考了 4 道概念题(逻辑物理结构、哈夫曼树、散列查找、快速排序),不知道是否为一种趋势;
选择题、设计题没有太大变化。