邻接表实现图的C++代码问题:非连续节点输出异常求助
问题根源
- 邻接表存储方式局限:代码里用
vector<int> adj[10000]固定大小数组存邻接表,这种结构强制要求节点编号必须连续且落在0~9999范围内,完全无法适配非连续的节点编号(比如2、4、5这类不连续编号)。 - 打印逻辑错误:
print函数里用for(int i=0;i<n+1;i++)循环遍历节点,这里的n是用户输入的节点总数,不是节点的最大编号。比如节点是2、4、5(共3个节点,n=3),循环会遍历0~3,导致:- 打印出不存在的节点0、1、3的空邻接表
- 实际存在的节点4、5完全被遗漏,根本不会被打印
另外代码引入了unordered_map头文件却未使用,属于冗余代码。
修复方案
改用unordered_map<int, vector<int>>作为邻接表存储结构,它可以自动适配任意整数类型的节点编号(连续或非连续均可),同时调整打印逻辑,直接遍历map中所有存在的节点即可。
修复后的完整代码:
#include<iostream> #include<vector> #include<unordered_map> using namespace std; class graph{ public: unordered_map<int, vector<int>> adj; void insert(int u, int v, bool direction) { adj[u].push_back(v); // direction为1表示无向图,双向添加边 if(direction == 1) { adj[v].push_back(u); } } void print() { // 遍历所有存在的节点 for(auto& pair : adj) { cout << pair.first << "->"; for(int neighbor : pair.second) { cout << neighbor << ","; } cout << endl; } } }; int main() { int n; cout << "Enter no of nodes" << endl; cin >> n; cout << "Enter no of edges" << endl; int m; cin >> m; graph g; for(int i=0; i<m; i++) { int u, v; cin >> u >> v; // 1表示无向图,0表示有向图 g.insert(u, v, 1); } g.print(); return 0; }
额外说明
- 修复后的代码不再依赖节点编号的连续性,不管节点是0、1、2还是2、4、5这类非连续编号,都能正确存储和打印邻接表
print函数不再需要传入节点总数,直接遍历unordered_map的键值对即可输出所有存在的节点及其邻接节点- 移除了未使用的
list头文件,精简了代码
内容的提问来源于stack exchange,提问作者Princy
相关产品推荐
相关产品推荐

