C++实现邻接列表时出错
Error in C++ implementation of Adjacency List
为什么在这个C++实现的邻接列表中出现分段错误?我的printList()
函数或getter和setter函数中的一个有问题吗?同样的实现在Java中工作,但在C++中不工作。
#include<iostream>
#include<list>
using namespace std;
class Graph
{
int V;
list<int> *adj;
public:
Graph(int V)
{
this->V = V;
adj = new list<int>[V];
}
void addEdge(int u, int v)
{
this->adj[u].push_back(v);
}
int getVertexCount()
{
return this->V;
}
list<int>* getList()
{
return this->adj;
}
};
void printList(Graph g)
{
list<int> *adj = g.getList();
list<int>::iterator it;
for(int i=0; i< g.getVertexCount(); i++)
{
cout << "Adjacency list of vertex " << i << "is:" <<endl;
for(it=adj[i].begin(); it != adj[i].end(); it++)
{
cout << *it << "->";
}
}
}
int main()
{
Graph g(7);
g.addEdge(0,1);
g.addEdge(0,2);
g.addEdge(0,3);
g.addEdge(1,5);
g.addEdge(1,6);
g.addEdge(2,0);
g.addEdge(2,4);
g.addEdge(2,6);
g.addEdge(3,0);
g.addEdge(3,5);
g.addEdge(3,7);
g.addEdge(4,2);
g.addEdge(4,7);
g.addEdge(5,3);
g.addEdge(5,7);
g.addEdge(6,1);
g.addEdge(6,2);
g.addEdge(7,5);
g.addEdge(7,3);
g.addEdge(7,4);
printList(g);
return 0;
}
问题是分配7个条目:
Graph g(7);
然后访问第8个
g.addEdge(7,4);
更小巧、更灵活
#include <iostream>
#include <list>
#include <vector>
using namespace std;
class Graph {
vector< list<int> > adj;
public:
Graph( void ) {}
void addEdge( int u, int v ) {
if ( u > ( ( int )( adj.size() ) - 1 ) ) {
adj.resize( u + 1 );
}
adj[u].push_back( v );
}
int getVertexCount() const {
return adj.size();
}
const vector< list<int> >& getList() const {
return adj;
}
};
void printList( const Graph& g ) {
const vector< list<int> >& adj( g.getList() );
list<int>::const_iterator it;
for ( int i = 0; i < g.getVertexCount(); i++ ) {
cout << "Adjacency list of vertex " << i << " is:";
for ( it = adj[i].begin(); it != adj[i].end(); it++ ) {
cout << *it << "->";
}
cout << endl;
}
}
int main() {
Graph g;
g.addEdge( 0, 1 );
g.addEdge( 0, 2 );
g.addEdge( 0, 3 );
g.addEdge( 1, 5 );
g.addEdge( 1, 6 );
g.addEdge( 2, 0 );
g.addEdge( 2, 4 );
g.addEdge( 2, 6 );
g.addEdge( 3, 0 );
g.addEdge( 3, 5 );
g.addEdge( 3, 7 );
g.addEdge( 4, 2 );
g.addEdge( 4, 7 );
g.addEdge( 5, 3 );
g.addEdge( 5, 7 );
g.addEdge( 6, 1 );
g.addEdge( 6, 2 );
g.addEdge( 7, 5 );
g.addEdge( 7, 3 );
g.addEdge( 7, 4 );
printList( g );
return 0;
}
玩得开心。
相关文章:
- 读取文件的最后一行并输入到链接列表时出错
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 基于数组的列表 - 动态数组创建时出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 方法的参数列表出错
- 使用 C++ 的迭代目录列表出错
- 尝试访问列表时出错
- 使用列表 STL 时出错
- C2057构造函数初始化列表中的常量值定义出错
- 使用变量参数列表为传递的引用赋值(VS2010中出错)
- 创建模板树节点列表时出错
- 通过函数后从列表中删除项目时出错
- 链接列表的Push_back函数出错
- 泛型列表节点类中出错
- C++实现邻接列表时出错
- 运行列表的实现时出错
- 使用链接列表"Stop working"的 c++ 代码中出错
- g++4.8.2上列表方法参数默认初始化时出错
- 将大括号括起来的初始值设定项列表转换为类型时出错的含义
- 如果类构造函数的大括号闭合列表的大小错误,则编译时出错