有这里有几个错误。
首先,你是不是初始化迭代器,像其他的说:
list<vertex*>::iterator it = r_list->begin();
做到这一点,你的代码将被罚款。但是你的代码是以不好的方式完成的。
你为什么要从堆中分配列表?看看你的代码:你有内存泄漏。你不在任何地方拨打delete r_list
。这就是为什么你应该使用智能指针(std::unique_ptr
,std::shared_ptr
如果你有C++ 11,升压等效否则:boost::scoped_ptr
和boost::shared_ptr
)
但更好的是,只是做了堆栈上:
//create a list to hold the vertices
list<vertex*> r_list;
list<vertex*>::iterator it = r_list->begin();
r_list.insert(it, pr);
另外,使用迭代器插入正在经历漫长的过程。只要使用push front()或push back():
//create a list to hold the vertices
list<vertex*> r_list;
r_list.push_back(pr);
另一件事:如果你的列表会超越你已经构建了顶点,这将指向东西无效。
例如:
// global
list<vertex*> r_list;
void some_function(void)
{
//create the vertices
vertex r = {WHITE, NULL, NULL};
//create pointer to the vertex structures
vertex *pr = &r;
r_list.push_back(pr);
} // right here, vertex r stops existing: the list now contains an
// invalid pointer.
一个解决方案是存储指向堆分配的顶点:
// global
list<vertex*> r_list;
void some_function(void)
{
//create the vertices
vertex *r = new vertex;
r->color = WHITE;
r->distance = 0;
r->parent = 0;
r_list.push_back(r);
}
即使列表被指向有效的堆分配顶点后的功能现在。现在有一个问题,即当您完成使用列表时,您需要通过lsit并在每个元素上调用delete
。这个问题是通过使用Boost Pointer Container Library来协助的。
的最好办法,虽然是只存放顶点本身(而不是指向它们的指针):
//create a list to hold the vertices
list<vertex> r_list;
//create the vertices
vertex r = {WHITE, NULL, NULL};
r_list.push_back(r);
如果给顶点构造函数,你甚至可以只构建他们就地:
struct vertex
{
int color;
int distance;
char parent;
vertex(int _color, int _distance, char _parent) :
color(_color),
distance(_distance),
parent(_parent)
{
}
};
//create a list to hold the vertices
list<vertex> r_list;
r_list.push_back(vertex(WHITE, NULL, NULL));
(现在这些是你的问题外)
首先,NULL一般只用指针打交道时使用。由于distance
和parent
不是指针,使用0
初始化它们,而不是NULL
:
//create the vertices
vertex r = {WHITE, 0, 0};
其次,使用constants
而不是#define
:
#define NUM_VERTICES 8 // <- bad
const int NumberVertices = 8; // <- good
最后,给你的枚举的名称,或地方它在一个命名空间:
enum Color { WHITE, GRAY, BLACK };
希望这些帮助!
你在主函数中缺少返回值 – rfcoder89 2016-10-01 07:48:51