Итак, я пытаюсь создать собственную интерпретацию графа со связанным списком;
По сути, я хочу создать узлы, связанные с другими узлами с помощью координат n / e / s / w, и каждый раз, когда я создаюузел, эти узлы добавляются в список, который я могу проверить позже под названием «Существует» (если он существует).
Я размышляю над парой координат '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 (), вызываемая first в 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.
IЯ могу создать узлы просто отлично, однако в методе 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 во всем коде, для его работы потребуется настройка.
Идея состоит в том, что «до» означает существующий узел, который будет подключаться к добавляемому узлу.