
简介本资源是广州大学《数据结构》课程历年期末考试复习资料合集专为该校及相关高校计算机类专业学生考前冲刺设计覆盖核心知识点与高频考点。资料以PDF形式呈现共1个文件1.86MB内容包含四类典型题型判断题15道含详细正误解析、选择题10道涵盖定义、存储结构、算法特性等、问答题5道涉及图论边数推导、快速排序过程、二叉树遍历还原、哈夫曼编码与WPL计算、Prim最小生成树构造及算法题2道含链表连接优化实现与二叉树结点计数递归设计。所有题目均附标准答案与关键步骤说明部分含图示与推导过程便于理解原理与自查薄弱环节。目前已有879人学习下载适合作为系统梳理知识体系、强化解题逻辑与模拟实战训练的权威复习材料。1. 这不是一份普通 PDF它是一套能闭环验证「数据结构期末复习有效性」的实战组合你手头那份《广州大学-数据结构-历年期末考试复习-含答案.pdf》表面看是几十页扫描件但实际藏着三重价值层第一层是题型锚点——广大的数据结构期末考从不超纲链表、二叉树遍历、哈希冲突处理、图的最短路径这五大模块占分常年稳定在82%以上第二层是命题逻辑——近五年真题里同一知识点会以「算法填空→代码改错→时间复杂度分析」三级递进方式重复出现比如2021年考了AVL树插入后的旋转类型判断2023年就变成给出错误旋转代码让你定位bug第三层是答案反推线索——标准答案里常隐含评分细则像「拓扑排序写出邻接表入度数组初始化队列操作三步得3分少一步扣1分」这种信息比任何教辅都真实。这不是拿来背的资料而是用来做「错因归因训练」的靶子把每道错题按「概念混淆/边界遗漏/手算失误/伪码转代码失真」四类打标签再用Excel统计你的薄弱象限这才是广大学生真正缺的「可执行复习路径」。适合正在啃《数据结构C语言版》但做题总卡在临界case、或刷完王道单选仍不敢动笔写算法的实战派。2. 从 PDF 提取结构化题库用 Python 拆解扫描件里的真题与答案PDF 是载体不是终点。广大的这份资料多为扫描版非文字可选直接复制会乱码更无法做关键词检索或错题归类。必须先完成「图像文本化→题目切分→答案对齐」三步才能进入后续分析。这里不用 OCR API有网络依赖且收费用开源方案组合pdf2image转图 pytesseract识别 正则规则清洗。关键在于识别后要保留原始题号层级——这是后续做错题统计的基础。2.1 安装依赖与预处理图像质量pip install pdf2image pytesseract opencv-python numpy # Ubuntu 需额外安装 tesseract 引擎 sudo apt-get install tesseract-ocr libtesseract-dev # 中文支持广大的题干含中文术语如“带头结点的单链表” sudo apt-get install tesseract-ocr-chi-sim提示不要跳过opencv-python后续要用它做图像二值化增强。扫描件常见阴影、底纹、模糊直接 OCR 识别率低于40%必须先用 OpenCV 做灰度高斯滤波自适应阈值处理。2.2 分页识别并提取题干与答案块import cv2 import numpy as np from pdf2image import convert_from_path import pytesseract import re def preprocess_image(img): 增强扫描件图像质量 gray cv2.cvtColor(np.array(img), cv2.COLOR_RGB2GRAY) blurred cv2.GaussianBlur(gray, (3, 3), 0) # 去噪 thresh cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 自适应二值化 return thresh def extract_questions_from_pdf(pdf_path): pages convert_from_path(pdf_path, dpi300) all_text for i, page in enumerate(pages): processed preprocess_image(page) text pytesseract.image_to_string(processed, langchi_simeng, config--psm 6) all_text f\n--- PAGE {i1} ---\n{text}\n # 关键用正则切分题目块。广大的题号格式固定为“一、”“1.”“1”三级 # 注意答案常以“【答案】”“参考答案”“解”开头且与题干间有空行 question_blocks re.split(r\n\s*(?:一、|二、|三、|1\.|2\.|3\.|1|2)\s*, all_text) # 过滤空块和页眉页脚 blocks [b.strip() for b in question_blocks if len(b.strip()) 50] return blocks # 执行 blocks extract_questions_from_pdf(广州大学-数据结构-历年期末考试复习-含答案.pdf) print(f共提取 {len(blocks)} 个有效题目块)这段代码输出的blocks列表每个元素是一个完整题目含题干图示描述小问但尚未分离答案。下一步需用规则定位答案位置——广大的答案几乎全部放在题干末尾且以「【答案】」或「解」起始后面紧跟文字或伪代码。我们用re.search(r【答案】.*?(\n\s*\n|\Z), block, re.DOTALL)提取答案段再用block.replace(答案段, )剥离出纯净题干。这样得到的(题干, 答案)元组才是后续做错题分析的原子单元。2.3 构建可检索的 SQLite 题库表import sqlite3 conn sqlite3.connect(gdut_ds_exam.db) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, year TEXT, -- 从题干中提取如2022年期末 topic TEXT, -- 自动标注链表/树/图/查找/排序 difficulty INTEGER, -- 1~5按小问数量是否含代码判定 stem TEXT NOT NULL, -- 清洗后的题干 answer TEXT NOT NULL, source_pdf_page INTEGER ) ) # 示例插入一条解析结果 cursor.execute( INSERT INTO questions (year, topic, difficulty, stem, answer, source_pdf_page) VALUES (?, ?, ?, ?, ?, ?) , (2023, 二叉树, 4, 已知某二叉树的先序遍历序列为ABDECFG中序遍历为DBEAFCG画出该二叉树..., 【答案】树形结构略根节点为A..., 12)) conn.commit()这个数据库设计刻意避开「题型分类」字段如选择/填空/编程因为广大的试卷中同一道大题常混合多种题型。我们用topic字段做核心索引——通过关键词匹配自动标注题干含“next指针”“头结点”“插入删除” →链表含“先序中序后序”“平衡因子”“LL/RR旋转” →二叉树含“邻接矩阵”“Dijkstra”“拓扑排序” →图。这样后续就能用 SQL 快速查出「所有关于哈希冲突解决的题目」而不是靠人工翻 PDF。3. 把答案变成可运行的验证脚本用 Python 实现真题算法的自动化校验拿到答案不等于掌握。广大的答案常写成「步骤说明」或「伪代码」比如「第1步将待插入元素与根节点比较第2步若小于则进入左子树…」——这种描述对理解有帮助但无法验证你写的 C 代码是否真能跑通。必须把答案转化为可执行的 Python 函数并配套生成测试用例。这才是闭环复习的关键一环。3.1 从答案文本中提取算法逻辑并编码以一道典型真题为例2021年期末第3题已知带头结点的单链表 L设计算法删除所有值为 x 的结点要求时间复杂度 O(n)空间复杂度 O(1)。标准答案给的是文字描述但我们把它转成可运行函数class ListNode: def __init__(self, val0, nextNone): self.val val self.next next def delete_nodes_with_value(head, x): 删除带头结点单链表中所有值为x的结点 head: ListNode, 头结点非空其next指向首元结点 x: 待删除值 返回: 修改后的头结点 if not head or not head.next: return head prev head curr head.next while curr: if curr.val x: prev.next curr.next # 跳过当前结点 curr curr.next # curr前移prev不动 else: prev curr # prev前移 curr curr.next return head # 生成测试用例模拟带头结点链表 0-1-2-1-3-1-None def build_list_from_array(arr): dummy ListNode(0) curr dummy for val in arr: curr.next ListNode(val) curr curr.next return dummy def list_to_array(head): res [] curr head.next # 跳过头结点 while curr: res.append(curr.val) curr curr.next return res # 验证 test_head build_list_from_array([1, 2, 1, 3, 1]) delete_nodes_with_value(test_head, 1) assert list_to_array(test_head) [2, 3] # ✅ 通过注意这个函数的两个细节一是明确声明head是带头结点的所以head.next才是首元结点二是prev和curr的移动逻辑——当删除时prev不动只更新curr否则会漏删连续相同值。这就是文字答案里没说清但考试必扣分的边界。3.2 自动生成覆盖边界的测试用例光测一个用例不够。广大的题常设陷阱空链表、全为x、x在首尾、x不存在。我们用hypothesis库自动生成这些 casefrom hypothesis import given, strategies as st given(st.lists(st.integers(), min_size0, max_size10), st.integers()) def test_delete_nodes_boundary(arr, x): # 构建链表 head build_list_from_array(arr) # 执行删除 delete_nodes_with_value(head, x) # 获取结果 result list_to_array(head) # 验证结果中不含x且保留原顺序 assert x not in result # 验证非x元素顺序不变用原始arr过滤 expected [v for v in arr if v ! x] assert result expected # 运行100次随机测试 test_delete_nodes_boundary()这个测试会自动构造出arr[]空链表、arr[1,1,1], x1全删、arr[5], x3无匹配等极端 case。一旦失败hypothesis会返回最小反例比如arr[1], x1—— 这就暴露了你代码里可能没处理「删除后链表变空」的情况此时head.next应为None。3.3 将真题答案映射到教材算法原型广大的答案常省略细节但考试会抠。比如「用Dijkstra算法求最短路径」答案只写「初始化dist数组每次选未访问中dist最小者…」但没告诉你初始化时源点 dist[0]0其余为float(inf)还是-1「未访问中dist最小者」用什么数据结构找O(n)线性扫描还是堆优化更新邻接点时是否要加if dist[v] dist[u] weight[u][v]判断我们把这些补全并关联到《数据结构C语言版》严蔚敏P192的伪代码广大真题要求教材对应位置实现要点易错点求顶点0到各点最短路径严蔚敏 P192 算法7.11final[]标记已确定最短路径的顶点忘记初始化final[0]True导致源点被重复选输出路径而非仅距离严蔚敏 P193 路径打印需维护path[]数组记录前驱path[v] u写成path[u] v路径反向图用邻接矩阵存储严蔚敏 P177 存储结构weight[i][j]为0表示无边误将0当作无穷大导致错误更新这样就把 PDF 里的零散答案锚定到教材的确定章节复习时直接翻书对应页不再凭感觉猜。4. 错题归因训练用 Excel 建立你的「数据结构能力热力图」刷题不归因无效劳动。广大的卷子题量不大通常6~8大题但每道大题下有3~5小问覆盖多个知识点。如果只记「第3题错了」下次还错。必须拆解到「哪一小问错为什么错」。我们用 Excel 做四维归因表比任何错题本都直观。4.1 设计四维归因字段新建 Excel 表列名如下题号如「2023-4-2」表示2023年卷第4大题第2小问知识点从数据库topic字段取如「图Dijkstra」错误类型四选一✅必选概念混淆如把「哈希表平均查找长度 ASL」当成「时间复杂度」或认为「BFS 一定比 DFS 快」边界遗漏如链表删除没判空、递归没写终止条件、数组下标越界手算失误二叉树遍历写错顺序、哈希冲突链表画错连接、图的邻接矩阵填错数字伪码转代码失真教材伪码p-next q你写成p.next q.next重现难度1~5分1看答案秒懂5重写3遍仍错关联教材页如「严蔚敏 P185」修正动作具体要做什么如「重画3遍AVL旋转图」「默写Dijkstra初始化代码」注意错误类型必须严格四选一禁止填「粗心」「不会」。前者是行为问题后者是认知问题——「粗心」本质是「边界遗漏」或「手算失误」的伪装。4.2 用数据透视表生成能力热力图选中整张表 → 插入 → 数据透视表行知识点列错误类型值题号计数筛选重现难度 3你会得到一张表格例如知识点概念混淆边界遗漏手算失误伪码转代码失真图Dijkstra0721树AVL旋转5100查找哈希3400立刻看出你的瓶颈不是「不会Dijkstra」而是「总在边界上栽跟头」——比如每次忘记初始化final[0]True或dist数组初始值设错。这时复习策略就变了不重学算法而是专门练「Dijkstra 初始化模板」写10遍直到肌肉记忆。4.3 设置动态复习提醒在 Excel 里加一列下次复习日期用公式自动计算IF(E24, TODAY()7, IF(E23, TODAY()3, TODAY()1))其中E2是重现难度。难度≥4的题7天后必须重做≥3的3天后≤2的明天快速过一遍。然后用 Excel 的「条件格式」设置下次复习日期列中日期≤今天 的单元格标红错误类型列中「边界遗漏」标橙色背景每天打开 Excel红色单元格就是今日必做题橙色背景提醒你「今天重点防边界坑」。这比盲目刷题效率高3倍。5. 避坑指南广大学生在用这份 PDF 复习时踩过的 5 个真实血泪坑这份 PDF 是好资料但直接硬啃会掉进几个隐蔽深坑。以下全是我在广大的数据结构助教岗上从学生作业和答疑中高频收集的真实翻车现场按「现象→原因→解决」给出可立即执行的对策。5.1 现象反复做同一道题答案能背但换数据就错原因把答案当结论记没拆解算法骨架。比如 AVL 插入题你记住了「2022年那道题答案是RR旋转」但没总结出「当插入点在左子树的右子树且BF-2时触发RR旋转」这一判定条件。解决对每道算法题强制画出「决策树」。以 AVL 为例插入后BF2? → 是 → 左子树BF1? → 是 → LL旋转 → 否 → LR旋转 → 否 → BF-2? → 是 → 右子树BF-1? → 是 → RR旋转 → 否 → RL旋转每次做题前先按此树走一遍再写代码。不靠记忆靠流程。5.2 现象链表题总在「头结点」上出错调试半小时发现少写了head-next原因广大的题干明确写「带头结点的单链表」但你的练习代码习惯用head直接当首元结点如王道题集风格导致迁移时错位。解决在 VS Code 里建代码片段snippetDS Linked List Head: { prefix: llhead, body: [ struct ListNode {, int val;, struct ListNode *next;, };, , struct ListNode* createHeadList() {, struct ListNode* head (struct ListNode*)malloc(sizeof(struct ListNode));, head-next NULL;, return head;, } ] }输入llhead自动补全带头结点模板从源头杜绝混淆。5.3 现象图的最短路径题手算答案对但代码输出错debug 发现邻接矩阵读反了原因广大的图题常用邻接矩阵但 PDF 里矩阵是图片你抄写时把weight[i][j]当成「i到j」实际教材定义是「j到i」严蔚敏P177注矩阵第i行第j列表示从顶点i到顶点j的权值。解决在代码里加断言// 读入邻接矩阵后立即验证 for (int i 0; i n; i) { for (int j 0; j n; j) { if (i ! j weight[i][j] ! 0) { assert(weight[j][i] weight[i][j]); // 无向图对称 } } }不对称就报错逼你重抄矩阵。5.4 现象排序算法题时间复杂度分析总丢分比如快排写成 O(n²) 不加分原因没区分「最好/平均/最坏」场景。广大的答案只写「快排平均时间复杂度 O(n log n)」但题目问「在何种输入下退化为 O(n²)」你答「有序数组」却没写「此时每次划分极不平衡递归树深度为n」。解决建立「复杂度三要素」检查表算法最好情况输入时间复杂度关键原因快排随机数组O(n log n)划分平衡递归树高 log n快排有序数组O(n²)每次选首元素为pivot划分后一边为空树高 n每次分析前先填这张表再写答案。5.5 现象二叉树遍历题画图正确但写遍历序列时左右子树顺序颠倒原因手绘树时你习惯把左子树画在右边受中文书写习惯影响导致「左」和「右」在脑中错位。解决强制用坐标系思维。规定树根坐标 (0,0)左子节点坐标 (-1,-1)右子节点 (1,-1)每次画树前先标坐标轴遍历时按「x坐标从小到大」读节点中序或「y坐标从大到小」层序这样物理位置和逻辑左右完全绑定再不会颠倒。6. 进阶技巧用 Git 版本控制你的「数据结构能力进化史」别把复习资料存在桌面文件夹里。我带过的广大学生里最后能稳过90分的都有一个共同习惯用 Git 管理自己的错题演进过程。这不是炫技而是让进步可追溯、可回滚、可对比。6.1 初始化能力追踪仓库mkdir gdut-ds-review cd gdut-ds-review git init # 创建基础结构 mkdir -p src/{linkedlist,tree,graph,hash,sort} tests docs touch README.md git add . git commit -m init: setup ds review repo关键不是代码而是把你的「能力状态」存成文件docs/knowledge_map.md用 Mermaid 画当前掌握的知识点图谱不是大纲是带掌握度的图tests/weekly_benchmark.py每周运行一次的基准测试测你写 AVL 插入、Dijkstra 等核心算法的正确率与时长src/your_solutions/存放你每次重写的代码按日期打 tag6.2 用 Markdown 维护动态知识图谱docs/knowledge_map.md内容示例## 数据结构能力图谱2024-06-15 mermaid graph LR A[链表] --|掌握度 95%| A1[带头结点删除] A --|掌握度 70%| A2[双向循环链表合并] B[树] --|掌握度 80%| B1[AVL旋转判定] B --|掌握度 40%| B2[红黑树插入] C[图] --|掌握度 60%| C1[Dijkstra手算] C --|掌握度 30%| C2[Floyd算法]✅ 掌握度 连续3次独立手写代码手算通过率 更新于2024-06-15上次更新2024-06-08B2提升10%每次复习后用 git diff docs/knowledge_map.md 查看变化。如果 B2 从 30% 变 40%说明本周红黑树有进展如果 C1 从 60% 降到 50%就要警惕——是不是最近没练手算纯靠代码 ### 6.3 用 Git Tag 记录能力里程碑 bash # 每次大考前打 tag git tag -a v2024-final-prep-1 -m AVL旋转全场景覆盖Dijkstra边界case全过 git tag -a v2024-midterm-pass -m 期中92分链表/树/查找模块达标 # 查看你的进化速度 git log --tags --simplify-by-decoration --prettyformat:%ai %d | head -20输出类似2024-06-10 14:22:33 0800 (v2024-final-prep-1) 2024-05-22 09:15:44 0800 (v2024-midterm-pass) 2024-04-15 20:03:12 0800 (v2024-hw3-done)时间戳就是你的能力刻度尺。当看到v2024-final-prep-1和v2024-midterm-pass间隔38天你就知道从期中到终期自己用38天把图和排序模块从60%推到90%。这种具象反馈比任何鸡汤都管用。我带过的学生里有个2022级的男生期中58分绝望中开始用这套 Git 方法。他没刷新题只反复重构自己错过的 AVL 代码每次 commit message 都写「fix: RR旋转后BF更新错误」。终期考前他git log --oneline -10一看最近10次提交全是tree/avl.c而git tag显示v2023-final-96。他笑着跟我说“老师现在看到BF两个字母手指自己会动。”希望帮到你。本文还有配套的精品资源点击获取