本页详细介绍了 Hello Algo 仓库中 C 和 C++ 数据结构与算法的实现。这些实现遵循了语言的惯用模式,并保持了仓库内所有语言版本接口的一致性。其他语言的实现请参考相应的页面,例如 Python 实现 或 Rust 实现。
本仓库中的 C/C++ 实现采用了结构化的方法,包括头文件、通用工具和特定语言的内存管理。
来源: .gitattributes, codes/c/chapter_array_and_linkedlist/CMakeLists.txt, codes/c/chapter_stack_and_queue/CMakeLists.txt
C 和 C++ 实现都遵循这些通用模式
utils/common.h (C) 或 utils/common.hpp (C++) 导入main() 函数),演示了用法Hello Algo 仓库中的 C 实现遵循一致的内存管理模式
来源: codes/c/chapter_array_and_linkedlist/my_list.c, codes/c/chapter_stack_and_queue/array_stack.c, codes/c/chapter_tree/binary_search_tree.c
C 实现的关键特征
C 中定义数据结构的典型模式
/* Structure Definition */
typedef struct {
// Internal data
// Typically includes size, capacity, and data pointers
} StructureName;
/* Constructor */
StructureName* newStructureName(...) {
// Allocate memory and initialize
}
/* Destructor */
void delStructureName(StructureName* obj) {
// Free memory resources
}
/* Operations */
// Various functions that operate on the structure
来源: codes/c/chapter_array_and_linkedlist/my_list.c:9-15, codes/c/chapter_stack_and_queue/array_stack.c:11-15
C++ 实现利用了该语言的面向对象特性和标准模板库 (STL)
vector, unordered_map 等)让我们比较一下 C 和 C++ 中的冒泡排序实现
| C语言实现 | C++ 实现 |
|---|---|
| 使用原生数组 | 使用 std::vector |
| 手动交换元素 | 使用 std::swap |
| 纯过程式方法 | 利用 C++ 语言特性 |
| 显式管理数组大小 | Vector 管理大小 |
来源: codes/c/chapter_sorting/bubble_sort.c, codes/cpp/chapter_sorting/bubble_sort.cpp
C 中动态数组(MyList)的实现展示了基于数组的数据结构的常见模式
关键操作
extendCapacity() 会分配更大的数组来源: codes/c/chapter_array_and_linkedlist/my_list.c
链表实现演示了基于指针的数据结构
与基于数组的结构不同,链表操作侧重于通过指针进行节点操作。
来源: codes/c/chapter_array_and_linkedlist/linked_list.c
该仓库提供了两种 C 语言的栈实现,展示了不同的底层结构
不同实现之间的接口是一致的,而内部表示则不同
来源: codes/c/chapter_stack_and_queue/array_stack.c, codes/c/chapter_stack_and_queue/linkedlist_stack.c
与栈类似,队列和双端队列也有基于数组和基于链表的实现
每个实现都保持相同的接口,同时利用不同的数据结构。
来源: codes/c/chapter_stack_and_queue/array_queue.c, codes/c/chapter_stack_and_queue/linkedlist_queue.c, codes/c/chapter_stack_and_queue/array_deque.c, codes/c/chapter_stack_and_queue/linkedlist_deque.c
二叉树及其变种使用递归树结构实现
AVL 树通过平衡操作扩展了二叉搜索树,以保持 O(log n) 的高度。
来源: codes/c/chapter_tree/binary_search_tree.c, codes/c/chapter_tree/avl_tree.c
哈希表使用不同的冲突解决策略实现
开放寻址实现使用线性探测和墓碑标记来处理已删除的元素。
来源: codes/c/chapter_hashing/hash_map_open_addressing.c
该仓库包含多种排序算法,并采用了统一的模式实现
每个排序实现
来源: codes/c/chapter_sorting/bubble_sort.c, codes/c/chapter_sorting/insertion_sort.c
二分查找及其变种展示了高效的搜索技术
这些实现展示了不同的二分查找应用,代码差异很小。
来源: codes/c/chapter_searching/binary_search_insertion.c, codes/c/chapter_searching/binary_search_edge.c
C 实现遵循以下内存管理模式
构造函数-析构函数模式:
内存扩展策略:
错误处理:
assert())来源: codes/c/chapter_array_and_linkedlist/my_list.c:19-33, codes/c/chapter_stack_and_queue/linkedlist_stack.c:15-31
C 实现处理了多种内存安全问题
仓库中 C 和 C++ 实现的主要区别
| 方面 | C语言实现 | C++ 实现 |
|---|---|---|
| 内存管理 | 手动 (malloc/free) | RAII, 智能指针, STL 容器 |
| 数据结构 | 自定义结构体定义 | STL 容器 (vector, map 等) |
| 代码组织 | 基于函数 | 基于类,带有成员函数 |
| 算法实现 | 过程式,带显式指针 | 泛型,带模板和 STL 算法 |
| 错误处理 | 返回码,断言 | 异常(可能) |
| 资源安全 | 需要手动清理 | 通过析构函数自动处理 |
来源: codes/c/chapter_sorting/bubble_sort.c, codes/cpp/chapter_sorting/bubble_sort.cpp
Hello Algo 中的 C 和 C++ 实现提供了基础数据结构和算法的清晰示例,采用了适合语言的模式。C 实现侧重于显式内存管理和指针操作,而 C++ 实现则利用 STL 和语言特性来实现更安全、更简洁的代码。两种方法都保持了数据结构之间一致的接口,便于比较实现策略。
来源: codes/c/chapter_array_and_linkedlist/my_list.c, codes/c/chapter_stack_and_queue/array_stack.c, codes/c/chapter_tree/binary_search_tree.c, codes/cpp/chapter_sorting/bubble_sort.cpp