Я не могу использовать Очередь в моем абстрактном типе данных - PullRequest
1 голос
/ 05 декабря 2011

Я работаю над графиками и создал класс Graph и добавил #include <queue> к своему коду.Если я напишу queue<int> MyQueue в основной функции, она будет работать хорошо.Но если я напишу тот же код queue<int> MyQueue в своем классе Graph, это даст мне ошибку во время выполнения.Жду вашей помощи.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

class AdjListImp_Graph
{
    public: 
    vector<int> *array[8];
    vector<int> List[8];
    AdjListImp_Graph(){
        for(int i=1; i<8; i++)
            array[i] = &List[i];
    }
};

class AdjMatrixImp_Graph
{
    public:
    int AdjMatrix[7][7];
    queue<int> MyList; // !Having problem with this code!
    AdjMatrixImp_Graph(){
        for(int i=0; i<8; i++)
            for(int j=0; j<8; j++)
                AdjMatrix[i][j] = 0;
    }
};

int main (void)
{
    AdjListImp_Graph MyGraph_3a, MyGraph_3b, MyGraph_3c;
    MyGraph_3a.List[1].push_back(4);
    MyGraph_3a.List[2].push_back(4);
    MyGraph_3a.List[4].push_back(7);
    MyGraph_3a.List[6].push_back(3);
    MyGraph_3a.List[7].push_back(5);
    MyGraph_3b.List[1].push_back(2);
    MyGraph_3b.List[2].push_back(5);    MyGraph_3b.List[2].push_back(7);
    MyGraph_3b.List[4].push_back(3);    MyGraph_3b.List[4].push_back(6);
    MyGraph_3b.List[5].push_back(4);
    MyGraph_3b.List[6].push_back(1);    MyGraph_3b.List[6].push_back(7);
    MyGraph_3c.List[2].push_back(1);
    MyGraph_3c.List[3].push_back(4);    MyGraph_3c.List[3].push_back(6);
    MyGraph_3c.List[4].push_back(5);
    MyGraph_3c.List[5].push_back(2);
    MyGraph_3c.List[6].push_back(7);
    MyGraph_3c.List[7].push_back(2);
    /********************************************************************************************************/
    AdjMatrixImp_Graph My_Graph_3a, My_Graph_3b, My_Graph_3c;
    My_Graph_3a.AdjMatrix[1][4] = 1;
    My_Graph_3a.AdjMatrix[2][4] = 1;
    My_Graph_3a.AdjMatrix[3][2] = 1;
    My_Graph_3a.AdjMatrix[4][7] = 1; // 4'ten 7'ye yol   var.
    My_Graph_3a.AdjMatrix[6][3] = 1;
    My_Graph_3a.AdjMatrix[7][5] = 1;
    My_Graph_3b.AdjMatrix[1][2] = 1;
    My_Graph_3b.AdjMatrix[2][5] = 1;    My_Graph_3b.AdjMatrix[2][7] = 1;
    My_Graph_3b.AdjMatrix[4][3] = 1;    My_Graph_3b.AdjMatrix[4][6] = 1;
    My_Graph_3b.AdjMatrix[5][4] = 1;
    My_Graph_3b.AdjMatrix[6][1] = 1;    My_Graph_3b.AdjMatrix[6][7] = 1;
    My_Graph_3c.AdjMatrix[2][1] = 1;
    My_Graph_3c.AdjMatrix[3][4] = 1;    My_Graph_3c.AdjMatrix[3][6] = 1;
    My_Graph_3c.AdjMatrix[4][5] = 1;
    My_Graph_3c.AdjMatrix[5][2] = 1;
    My_Graph_3c.AdjMatrix[6][7] = 1;
    My_Graph_3c.AdjMatrix[7][2] = 1;

    system("pause");
    return EXIT_SUCCESS;
}

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Изменить объявление

    int AdjMatrix[7][7];

до

    int AdjMatrix[8][8];

и он не рухнет. Если у вас queue в main, работает по совпадению .


Кстати, я настоятельно рекомендую вам изменить дизайн ваших структур данных и не использовать указатели на контейнеры.

0 голосов
/ 05 декабря 2011

При инициализации AdjMatrixImp_Graph::AdjMatrix в конструкторе AdjMatrixImp_Graph вы выходите за границы массива.Возможно, он записывает в область памяти AdjMatrixImp_Graph::MyList и портит его структуру.

Измените циклы на for (int i;i<7;i++) for(int j;j<7;j++){.... Или вы можете использовать memset(AdjMatrix, 0, sizeof(AdjMatrix));

Проверка кода main предполагает, что определение AdjMatrix следует изменить на AdjMatrix[8][8].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...