因此,我正在尝试使用链接列表创建自己的图形解释;
从本质上讲,我想创建通过n / e / s / w坐标链接到其他节点的节点,并且每次创建节点时,这些节点都会添加到列表中,我可以在以后检查“ Exists”(如果存在)存在)。
我考虑这些节点的“ yx”对坐标以确认这一点。这是我的标题如下:
class Graph {
private:
struct Area {
pair<int , int> yx;
Area *north;
Area *east;
Area *south;
Area *west;
};
Area *Start;
Area *Current;
map<pair<int, int>, Area*> Exists; //Need to get the stored Area from this map
public:
Graph();
void Create();
//Add_Node calls Connect_Nodes()
void Add_Node(Area before, int code, int symbol, int color, pair<int,int> yx, string title, string description, int coordinate);
//Connects nodes if the key is found in the map
Area* Connect_Nodes(pair<int, int> yx, int coordinate);
};
这里是实现,Add_Node()首先在void Create()中调用:
Add_Node(*Start, 00001, '.', 3, Start->yx, "Hallway", "Halls", 1);
Add_Node接下来调用连接:
void Graph::Add_Node(Area before, pair<int, int> yx, ... int coordinate){
Area *ptr = Connect_Nodes(yx, coordinate);
和Connect方法:
Graph::Area* Graph::Connect_Nodes(pair<int,int> yx, int coordinate) {
pair<int, int> temp;
switch (coordinate) {
case 1:
temp.first = ++yx.first;
temp.second = yx.second;
break;
....
}
map<pair<int, int>, Area*>::iterator it;
it = Exists.find(temp);
if (it != Exists.end())
return it->second;
else return nullptr;
}
我的指针实现可能丢失了一些重要的东西,出现以下错误:
Exception thrown: read access violation.
std::_String_alloc<std::_String_base_types<char,std::allocator<char> > >::_Get_data(...) returned 0x14.
我可以很好地创建节点,但是,在Display()方法中,ptr会迭代到该节点,当我在创建的节点上运行ptr-> title时,会遇到读取访问冲突。是什么导致此错误?
我希望我已经对此进行了充分的记录,可以理解。
编辑:在我未发布的Add_Node方法中逐步发现以下内容:
void Graph::Add_Node(Area before, pair<int, int> yx, int coordinate){
bool passed = true;
Area *ptr = Connect_Nodes(yx, coordinate);
if (ptr != NULL) {
switch (coordinate) {
case 1:
before.north = ptr;
case 2:
before.east = ptr;
case 3:
before.south = ptr;
case 4:
before.west = ptr;
}
}
else {
do
{
Current = new Area;
Current_Code++;
Current->code = Current_Code;
switch (coordinate) {
case 1:
if (before.north == NULL)
{
Current->yx.first = ++before.yx.first;
Current->yx.second = before.yx.second;
Exists[Current->yx] = Current;
before.north = Current; // PROBLEM LINE
return;
}
当我在上面的代码中将before.north替换为Start-> north时,我可以正常显示所有内容而没有任何错误!
Start->north = Current;
但是,由于我在整个代码中都使用了before实例,因此需要进行调整才能正常工作。
这个想法是,“之前”表示将连接到要添加的节点的现有节点。