有這裏有幾個錯誤。
首先,你是不是初始化迭代器,像其他的說:
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