我不能在我的抽象数据类型中使用队列

I can't use Queue in my abstract data type

本文关键字:队列 抽象数据类型 不能 我的      更新时间:2023-10-16

我正在研究图形,我创建了一个图形类,并将#include <queue>添加到我的代码中。如果我把queue<int> MyQueue写在主函数里,效果很好。但是如果我在我的类图形中编写相同的代码queue<int> MyQueue,它会给我一个运行时错误。等待你的帮助。

#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;
}

更改声明

    int AdjMatrix[7][7];

    int AdjMatrix[8][8];

,它不会崩溃。当你在main中有queue时,它通过巧合工作。


顺便说一下,我强烈建议您改变数据结构的设计,不要使用指向容器的指针。

AdjMatrixImp_Graph的构造函数中初始化AdjMatrixImp_Graph::AdjMatrix时,您超出了数组边界。它可能会写入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]