在计算机科学中,图(Graph)是一种非常重要的非线性数据结构,广泛应用于社交网络、路径规划、依赖关系分析等领域。本文将带你从零开始,使用 C++ 实现一个动态图结构,让你即使没有数据结构基础也能轻松上手!

与静态图不同,动态图结构允许我们在程序运行时动态添加或删除节点(顶点)和边。这种灵活性对于处理不确定规模的数据(如实时社交网络)至关重要。
在 C++ 中,我们通常使用以下两种方式表示图:
本文将采用 邻接表 方式实现动态图,因为它更符合“动态”需求。
我们的目标是构建一个 Graph 类,支持以下功能:
addVertex)addEdge)printGraph)我们将使用 std::unordered_map 来存储每个顶点及其相邻顶点列表,这样可以快速查找和插入。
下面是一个完整的、可编译运行的 C++ 动态图结构实现:
#include <iostream>#include <unordered_map>#include <vector>#include <string>class Graph {private: std::unordered_map<std::string, std::vector<std::string>> adjList;public: // 添加顶点 void addVertex(const std::string& vertex) { // 如果顶点不存在,则初始化一个空的邻接列表 if (adjList.find(vertex) == adjList.end()) { adjList[vertex] = std::vector<std::string>(); } } // 添加无向边 void addEdge(const std::string& v1, const std::string& v2) { addVertex(v1); addVertex(v2); adjList[v1].push_back(v2); adjList[v2].push_back(v1); // 无向图:双向连接 } // 打印整个图 void printGraph() { for (const auto& pair : adjList) { std::cout << pair.first << ": "; for (const std::string& neighbor : pair.second) { std::cout << neighbor << " "; } std::cout << std::endl; } }};// 示例主函数int main() { Graph g; g.addEdge("A", "B"); g.addEdge("A", "C"); g.addEdge("B", "D"); g.addEdge("C", "D"); std::cout << "当前图结构如下:\n"; g.printGraph(); // 动态添加新节点和边 g.addEdge("D", "E"); std::cout << "\n添加 D-E 边后:\n"; g.printGraph(); return 0;}
1. 数据结构选择
我们使用 std::unordered_map<std::string, std::vector<std::string>> 作为邻接表:
2. addVertex 方法
确保顶点存在。如果不存在,就创建一个空的邻接列表。这避免了后续操作出错。
3. addEdge 方法
先确保两个顶点都存在,然后互相添加对方到自己的邻接列表中(因为是无向图)。如果你需要有向图,只需去掉 adjList[v2].push_back(v1); 这一行。
4. 动态性体现
你可以在程序运行中的任意时刻调用 addEdge 或 addVertex,图会自动扩展——这就是 C++动态图结构 的核心优势。
当前图结构如下:A: B C B: A D C: A D D: B C 添加 D-E 边后:A: B C B: A D C: A D D: B C E E: D
掌握了基础的 图数据结构实现 后,你可以尝试:
通过本文,你已经学会了如何用 C++ 构建一个灵活、可扩展的动态图结构。这种结构是许多高级算法(如 Dijkstra、Kruskal)的基础。无论你是准备面试,还是开发实际项目,掌握 C++图算法 的底层实现都将为你打下坚实基础。
希望这篇 动态图C++教程 对你有所帮助!动手试试吧,编程的乐趣在于实践!
本文由主机测评网于2025-12-13发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025127100.html