Как вернуть указатель на узел, вложенный в качестве значения карты?(Нарушение доступа) - PullRequest
0 голосов
/ 16 февраля 2019

Итак, я пытаюсь создать собственную интерпретацию графа со связанным списком;

По сути, я хочу создать узлы, связанные с другими узлами с помощью координат 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 во всем коде, для его работы потребуется настройка.

Идея состоит в том, что «до» означает существующий узел, который будет подключаться к добавляемому узлу.

...