C语言数据结构系列:总结与实战篇
- C语言数据结构系列(二十七):总结与实战
-
- 一、前言
- 二、系列回顾
-
- 2.1 线性结构
- 2.2 树形结构
- 2.3 图结构
- 2.4 排序算法
- 2.5 查找算法
- 三、LeetCode高频题实战
-
- 3.1 数组
- 3.2 链表
- 3.3 栈
- 3.4 树
- 3.5 图
- 3.6 排序
- 3.7 动态规划
- 四、进阶学习路线
-
- 4.1 进阶数据结构
- 4.2 算法进阶
- 4.3 系统设计
- 五、学习建议
-
- 5.1 刷题建议
- 5.2 学习方法
- 六、系列完结
-
- 6.1 目录
- 6.2 寄语
- 七、最后的话
C语言数据结构系列(二十七):总结与实战
🎯 本篇目标:回顾整个系列,实战LeetCode高频题! 📌 摘要:本文是 C 语言数据结构系列的收官之作,系统回顾了线性结构(数组、链表、栈、队列)、树形结构(二叉树、BST、堆、AVL、红黑树)、图结构(DFS、BFS、最小生成树、最短路径)、排序与查找算法,并精选 7 道 LeetCode 高频题(两数之和、反转链表、有效的括号、二叉树最大深度、岛屿数量、合并有序数组、爬楼梯)给出 C 语言实现。最后给出进阶学习路线与刷题建议,帮助读者完成从理论到实战的闭环。
一、前言
哈喽小伙伴们!👋
恭喜大家学完了整个数据结构系列!🎉
今天我们来:
二、系列回顾
2.1 线性结构
| 数组 | 连续存储 | 随机访问O(1) | 基础存储 |
| 链表 | 离散存储 | 插入删除O(1) | 动态数据 |
| 栈 | LIFO | push/pop | 括号匹配 |
| 队列 | FIFO | enqueue/dequeue | BFS |
2.2 树形结构
| 二叉树 | 两个孩子 | O(n) | 基础结构 |
| BST | 左<根<右 | O(logn) | 查找 |
| 堆 | 完全二叉树 | O(logn) | 优先队列 |
| AVL | 严格平衡 | O(logn) | 查找密集 |
| 红黑树 | 近似平衡 | O(logn) | 通用 |
2.3 图结构
| DFS | 深度遍历 | O(V+E) |
| BFS | 广度遍历 | O(V+E) |
| Prim | 最小生成树 | O(V²) |
| Kruskal | 最小生成树 | O(ElogE) |
| Dijkstra | 最短路径 | O(V²) |
| Floyd | 全源最短路 | O(V³) |
2.4 排序算法
| 冒泡 | O(n²) | O(n²) | ✅ | 教学 |
| 选择 | O(n²) | O(n²) | ❌ | 教学 |
| 插入 | O(n²) | O(n²) | ✅ | 小数据 |
| 快排 | O(nlogn) | O(n²) | ❌ | 通用 |
| 归并 | O(nlogn) | O(nlogn) | ✅ | 稳定排序 |
| 堆排 | O(nlogn) | O(nlogn) | ❌ | TopK |
| 计数 | O(n+k) | O(k) | ✅ | 小范围整数 |
2.5 查找算法
| 顺序查找 | O(n) | 无序 |
| 二分查找 | O(logn) | 有序 |
| 哈希表 | O(1)* | 通用 |
| 并查集 | O(α(n)) | 集合合并 |
三、LeetCode高频题实战
3.1 数组
题目1:两数之和
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
int *result = (int*)malloc(2 * sizeof(int));
*returnSize = 2;
for (int i = 0; i < numsSize; i++) {
for (int j = i + 1; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
3.2 链表
题目2:反转链表
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL, *curr = head;
while (curr) {
struct ListNode *next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
3.3 栈
题目3:有效的括号
bool isValid(char * s) {
char stack[5000];
int top = –1;
while (*s) {
if (*s == '(' || *s == '[' || *s == '{') {
stack[++top] = *s;
} else {
if (top == –1) return false;
if (*s == ')' && stack[top] != '(') return false;
if (*s == ']' && stack[top] != '[') return false;
if (*s == '}' && stack[top] != '{') return false;
top—;
}
s++;
}
return top == –1;
}
3.4 树
题目4:二叉树的最大深度
int maxDepth(struct TreeNode* root) {
if (!root) return 0;
int left = maxDepth(root->left);
int right = maxDepth(root->right);
return (left > right ? left : right) + 1;
}
3.5 图
题目5:岛屿数量
void dfs(char** grid, int i, int j, int gridSize, int colSize) {
if (i < 0 || i >= gridSize || j < 0 || j >= colSize) return;
if (grid[i][j] != '1') return;
grid[i][j] = '0';
dfs(grid, i+1, j, gridSize, colSize);
dfs(grid, i–1, j, gridSize, colSize);
dfs(grid, i, j+1, gridSize, colSize);
dfs(grid, i, j–1, gridSize, colSize);
}
int numIslands(char** grid, int gridSize, int* gridColSize) {
int count = 0;
int colSize = gridColSize[0];
for (int i = 0; i < gridSize; i++) {
for (int j = 0; j < colSize; j++) {
if (grid[i][j] == '1') {
dfs(grid, i, j, gridSize, colSize);
count++;
}
}
}
return count;
}
3.6 排序
题目6:合并两个有序数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int i = m – 1, j = n – 1, k = m + n – 1;
while (i >= 0 && j >= 0) {
if (nums1[i] > nums2[j])
nums1[k—] = nums1[i—];
else
nums1[k—] = nums2[j—];
}
while (j >= 0)
nums1[k—] = nums2[j—];
}
3.7 动态规划
题目7:爬楼梯
int climbStairs(int n) {
if (n <= 2) return n;
int dp[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i–1] + dp[i–2];
}
return dp[n];
}
四、进阶学习路线
4.1 进阶数据结构
- 🔴 B树/B+树
- 🔴 跳表
- 🔴 图数据库
- 🔴 布隆过滤器
4.2 算法进阶
- 🔴 动态规划专题
- 🔴 贪心算法
- 🔴 回溯算法
- 🔴 分治算法
4.3 系统设计
- 🔴 分布式系统
- 🔴 数据库设计
- 🔴 缓存设计
五、学习建议
5.1 刷题建议
LeetCode 📚
- 按标签刷
- 先易后难
- 总结模板
牛客网 🐮
- 面试真题
- 模拟面试
5.2 学习方法
理解原理 📖
- 画图理解
- 手动模拟
多写代码 💻
- 不看答案写
- 优化时间空间
总结模板 📝
- 常用数据结构
- 常用算法
六、系列完结
6.1 目录
| 01 | 数组:从入门到精通 |
| 02 | 单链表完全指南 |
| 03 | 双链表与循环链表 |
| 04 | 栈:后进先出的奥秘 |
| 05 | 队列:先进先出的艺术 |
| 06 | 串:字符串处理全攻略 |
| 07 | 二叉树入门:概念与存储 |
| 08 | 二叉树遍历:四种方式详解 |
| 09 | 二叉搜索树:高效查找 |
| 10 | 堆:优先队列的实现 |
| 11 | 哈夫曼树:最优编码 |
| 12 | 平衡二叉树:AVL与红黑树 |
| 13 | 图的基础:存储与表示 |
| 14 | 图的遍历:DFS与BFS |
| 15 | 最小生成树:Prim与Kruskal |
| 16 | 最短路径:Dijkstra与Floyd |
| 17 | 拓扑排序与关键路径 |
| 18 | 排序基础:冒泡与选择 |
| 19 | 插入排序与希尔排序 |
| 20 | 快速排序:分治经典 |
| 21 | 归并排序:稳定高效 |
| 22 | 堆排序:原地排序 |
| 23 | 非比较排序:计数、基数、桶 |
| 24 | 查找算法:从顺序到二分 |
| 25 | 哈希表:O(1)查找的秘密 |
| 26 | 并查集:集合合并 |
| 27 | 总结与实战 |
6.2 寄语
💡 数据结构是编程的内功,算法是招式。内功深厚,招式才能发挥威力!
坚持学习,你一定能成为优秀的程序员! 🚀
七、最后的话
感谢大家陪伴这个系列!如果觉得有帮助:
- 👍 点赞支持
- ⭐ 收藏复习
- 👤 关注获取更多
- 💬 评论交流讨论
我们下个系列再见! 👋
💡 数据结构学完了,但编程之路才刚刚开始!继续加油!🚀
网硕互联帮助中心


评论前必须登录!
注册