简介:《2019考研华中科技大学834真题.pdf》面向备考华中科技大学834计算机综合的考研学生,适合在强化冲刺与考前自测阶段用真题检验数据结构与计算机网络等知识掌握程度,并针对薄弱环节查漏补缺。压缩包内仅含1个PDF文件,大小约1.37MB,便于在电脑或平板上直接翻阅。内容覆盖选择题、填空题、判断题与计算题等题型,涉及串与线性表、链表操作、数组访问、二叉树遍历、队列与链式栈、图的广度优先遍历、堆排序与快速排序、哈夫曼编码、最小生成树、哈希表、二分查找,以及OSI/TCP-IP参考模型、路由选择、DNS查询等计算机网络考点。已有585人学习下载,可帮助读者熟悉834命题风格、梳理高频考点,并结合知识点解析开展限时训练与错题复盘,提升应试节奏。
1. 834的考点地图:两张卷子拼成的复习坐标系
834 这张卷子的结构,先看清楚再谈复习。它把数据结构与计算机网络拼在同一张纸上:前面是十道选择、十道填空、八道判断,后面接着四道数据结构综合题和四道网络计算题。数据结构的分量更重,题型从指针操作一直铺到最小生成树;计网则集中在协议归属、子网与路由、CRC 这几类可以动笔算的题上。这套组合适合已经把两本书过了一遍、需要把散点连成线的人;如果你还在按章节背书,先照着这张地图把题型和知识点对上号,比多刷十道题更有用。
2. 线性结构与存储层:串、链表、栈队列、数组的判定套路
2.1 串与线性表的边界:空串、空白串与存储结构
串的第一道选择题几乎年年围绕“空串是不是空白串”做文章。把三个概念分开记:空串是长度为 0 的串,里面一个字符都没有;空白串是含有一个或多个空格字符的串,长度大于 0;空格串只是空白串的另一种叫法。所以“空串就是空白串”错在长度上,“串的长度必须大于零”也错,只有“串是一种特殊的线性表”成立——它的元素被限定为字符,操作仍沿用线性表那一套。
| 概念 | 长度 | 内容 | 常见错误 |
|---|---|---|---|
空串"" | 0 | 无字符 | 与空白串混为一谈 |
空白串" " | ≥1 | 全是空格 | 认为它等于空串 |
一般串"ab" | 2 | 字符序列 | 认为元素只能是字母 |
存储结构上,定长顺序存储把串压在固定数组里,超出长度要截断;堆分配存储运行时按需申请,是教材里最常考的“可动态扩展”方案;块链存储用链表串起数据块,适合频繁插入删除但空间利用率低。模式匹配要看 KMP 的next数组,它的定义是“模式串前 j 个字符的最长相等前后缀长度”。以ababaca为例,next依次为 0、0、1、2、3、0、1。考场上真正容易错的是下标起点:有的教材next[1]=0,有的next[0]=-1,答题时先在草稿上标一句“从 0 开始”,后面才不会整段对不上。
2.2 链表题的两个抓手:头尾指针与操作代价
链表选择题很少考概念,几乎都在问“哪种结构让某两个操作最快”。判断方法只有一条:把题目里“最常用的操作”拆成指针动作,看每个动作能不能直接拿到入口。删除第一个结点,需要的是头结点的后继;在最后一个结点之后插入,需要的是尾指针。把这两个入口画在纸上,答案基本就出来了。
| 结构 | 尾部插入 | 删除首结点 | 关键原因 |
|---|---|---|---|
| 带头指针单链表 | O(n) | O(1) | 找尾要遍历 |
| 带尾指针单链表 | O(1) | O(n) | 找头要遍历 |
| 带尾指针单向循环链表 | O(1) | O(1) | rear->next就是头结点 |
| 带头指针双向循环链表 | O(1) | O(1) | head->prev是尾结点 |
表格里前两行是“单入口”结构,只能保一头;后两行是“双入口”结构,头尾都能直接摸到。题目若强调“在最后一个结点之后插入”和“删除第一个结点”这两个操作最常用,答案应落在能同时 O(1) 的结构上。这里有个流传很广的错解:把“带头指针的双向循环链表”当成唯一答案,却忽略了它在某些教材实现里并不保存尾指针,尾插仍要绕一圈。复习时以“入口是否现成”为准,不要背选项字母。
双向循环链表删除结点p的两行代码也要能默写:
// p 为待删除结点,链表带头结点且 p 不是头结点 p->prior->next = p->next; p->next->prior = p->prior; free(p);顺序不能反。先改前驱的后继,再改后继的前驱,这样p->prior和p->next都还在;如果先把p->next改掉,第二行就找不到原来的后继了。考判断题时,“静态链表插入删除不需要移动元素”这句话是对的——静态链表用数组游标模拟指针,改的是next域的下标,元素本身不动。这一点在后面易错点里还会再提一次。
2.3 栈与队列的指针改写:别把入队写成逆序
顺序栈的top有两种约定:指向栈顶元素,或指向栈顶的下一个空位。前者入栈先top++再赋值,后者先赋值再top++,初始化分别是top=-1和top=0。考题给代码让判断正误时,先看初始化,再看自增顺序,两步对不上就错。
链式栈的删除只有一句:top = top->next。它的前提是栈顶指针直接指向当前栈顶结点;如果题目画的是带头结点的链栈,删除的是top->next,指针改写就变成top->next = top->next->next。这两种画法都出现过,读题时先确认“top 指哪儿”。
链式队列的入队是错得最多的地方。设rear指向队尾结点,t是新结点,正确顺序是先把新结点的next置空,再让原队尾指向它,最后移动尾指针:
// 带头结点的链式队列,rear 指向当前队尾结点 void enqueue(Node *rear, Node *t) { t->next = NULL; // 新结点将成为新的队尾 rear->next = t; // 原队尾结点挂上新结点 rear = t; // 尾指针后移 }这段代码在真实工程里还有个坑:rear是值传递,函数内改了不影响外面,实际要传二级指针或把rear作为结构体成员返回。考试只考指针动作的顺序,但顺序写反的后果很直观——t->next = rear; rear = t;会把新结点指回旧队尾,队列变成反向单链,后面所有入队都错。循环队列则要记判空判满:牺牲一个单元时,front == rear为空,(rear+1) % MAX == front为满;不牺牲单元就加一个size计数器。判断题说“循环队列入队可能发生上溢”,在队满继续入队时成立,这句话本身没问题,别因为“循环”两个字就判错。
2.4 数组地址与广义表:公式和“表尾加一层括号”
二维数组地址计算只有一个公式,但要先确认存储方式。行优先时,LOC(i,j) = LOC(0,0) + (i*n + j) * L,其中n是列数、L是每个元素占的字节数;列优先则把i和j的角色对调,变成(j*m + i) * L,m是行数。题目给出A[0][0]的地址、行列数和元素大小,直接套;如果只给“下标变量 A[3][4] 的地址”,却没说元素大小和维度,那就缺条件,不要硬算。三维数组A[i][j][k]行优先的偏移是(i*n*p + j*p + k) * L,把每一维的长度想成“后面还有多少个元素”就不容易漏乘。
广义表考两个操作:取表头head和取表尾tail。表头是第一个元素,表尾是“去掉表头后剩下的元素组成的广义表”,注意表尾一定带一层括号。以LS = ((a,b),(c,d),(e),(f,0),(g,h))为例:
head(LS) = (a,b),第一个元素本身是个子表;tail(LS) = ((c,d),(e),(f,0),(g,h)),去掉第一个后剩下的四项重新组成一个广义表。
最容易错的是把表尾写成(c,d),(e),(f,0),(g,h),少了最外层括号。广义表的长度是顶层元素个数,这里是 5;深度是括号嵌套的最大层数,这里是 2。判断题常问“表尾一定是广义表”,答案为真,因为表尾的定义就是“由剩余元素构成的表”。
3. 树与图:遍历序列、哈夫曼、最小生成树与拓扑排序
3.1 二叉树遍历互推:前序定根、中序分左右
遍历序列互推的固定动作只有两步:前序的第一个元素是根;在中序里找到这个根,左边是左子树、右边是右子树。然后对左右子树递归。给一个自洽的例子:前序ABDEC,中序DBEAC。前序首字符A是根,中序里A左边DBE是左子树、右边C是右子树。左子树前序是BDE,根为B;中序DBE里B左边D、右边E。于是后序为D E B C A,即DEBCA。
| 已知序列 | 能否唯一确定二叉树 | 说明 |
|---|---|---|
| 前序 + 中序 | 能 | 前序定根,中序分左右 |
| 后序 + 中序 | 能 | 后序末尾定根,中序分左右 |
| 层序 + 中序 | 能 | 层序按层给根,中序分左右 |
| 前序 + 后序 | 不能 | 无法区分只有一个孩子时的左右 |
最后一行是判断题的高频点:前序和后序都只能确定父子关系,确定不了左右孩子。只有“前序 + 中序”或“后序 + 中序”才能唯一还原。另外,中序遍历得到递增序列的二叉树,在关键字互异的前提下就是二叉排序树,这个结论在易错点章还会展开。
3.2 哈夫曼树:没有度为 1 的结点,编码长度别想当然
哈夫曼树的构造是每次取权值最小的两个结点合并,新结点权值为两者之和,放回森林继续选。由此得到两个必须记住的结论:哈夫曼树是严格二叉树,不存在度为 1 的结点,即n1 = 0;若叶子数为n0,则度为 2 的结点n2 = n0 - 1,总结点数为2*n0 - 1。填空题问“哈夫曼树中有多少个度数为 1 的结点”,答案就是 0,不是n2 + 1——n0 = n2 + 1是任意二叉树的通用性质,套到哈夫曼树上求的是叶子数,别张冠李戴。
带权路径长度WPL等于每个叶子权值乘其深度再求和。以权值{1,2,3,3}为例:先合并 1 和 2 得 3,森林变为{3,3,3};再合并两个 3 得 6,森林{3,6};最后合并得 9。三个权值为 3 的结点里,有一个在第二轮就被合并,深度为 2;另一个留到第三轮,深度为 1。这说明频度相同的字符,编码长度不一定相同,取决于它在哪一轮被选中。哈夫曼编码是前缀码,任一编码都不是另一编码的前缀,所以译码不需要分隔符;编码本身不唯一,左右孩子交换就得到另一套合法编码,但WPL相同。
3.3 图的存储与遍历:邻接表的表结点数就是边数
邻接矩阵的空间是O(n^2),适合稠密图;邻接表的空间是O(n+e),适合稀疏图。有向图邻接表里,表头结点数等于顶点数n,表结点数等于边数m,因为每条有向边只在起点那条链上出现一次;无向图每条边出现两次,表结点数是2m。选择题问“n 个表头结点、m 个表结点,有多少条有向边”,答案就是m,不要减一。
BFS 和 DFS 的序列都不唯一,取决于邻接表中邻接点的排列顺序,但“从某个顶点出发能否访问到所有顶点”是确定的:连通图可以,非连通图不行,一次遍历只能走完一个连通分量。给一个边集E={(A,B),(A,C),(A,D),(B,E),(C,F)},从A出发按字母序访问,BFS 得到A B C D E F,DFS 得到A B E C F D。写答案时如果题目给了邻接表顺序,就严格按那个顺序走,不要按自己习惯的字母序。
3.4 最小生成树与拓扑排序:Kruskal 的选边顺序和入度清零
Kruskal 的动作是“排序边、从小到大选、用并查集判环、选够 n-1 条停”。以顶点{1,2,3,4,5,6}、边{(1,2)8,(1,3)5,(1,4)6,(1,6)15,(3,4)4,(2,4)12,(5,6)6,(2,6)7}为例,按权排序后依次是 4、5、6、6、7、8、12、15。选边过程:
- 选
(3,4)权 4; - 选
(1,3)权 5; (1,4)权 6 会让 1、3、4 成环,跳过;- 选
(5,6)权 6; - 选
(2,6)权 7; - 此时已有 4 条边、6 个顶点,还差一条,选
(1,2)权 8,把{1,3,4}和{2,5,6}连起来。
最小生成树边集为 `{(3,
本文还有配套的精品资源,点击获取