您好,我对C ++中typedef的用法有疑问。我正在尝试创建自己的图形类,在其中可以执行DFS和BFS。到目前为止,我已经附上了我上课的所有内容。但是,每次尝试编译时,都会遇到某些错误,但我不知道如何解决。我确定该错误与用于保存所有顶点的变量vertexList有关。

#include <iostream>
#include <stack>


class myGraph{
    public:
        typedef struct Vertex{
            char label;
            bool visited;
        }Vertex;
        myGraph(int);
        void AddVertex(char);
        void addEdge(int, int);
        int adjUnvisited(int);
        void displayVertex(int);
        void dfs();

    private:
        Vertex* vertexList;
        int** adjMatrix;
        int size;
        int vertices;
        int count;

};

myGraph::myGraph(int size){
    count = 0;
    size = size;
    vertices = size;
    vertexList = new Vertex[vertices];
    adjMatrix = new int*[size];
    for(int i=0; i<size; i++){
        adjMatrix[i] = new int[vertices];
    }

    for(int i=0; i<vertices; i++){
        for(int j=0; j<vertices; j++){
            adjMatrix[i][j] = 0;
        }
    }



}

void myGraph::AddVertex(char label){
    Vertex* myVertex = new Vertex();
    myVertex->label = label;
    myVertex->visited = false;
    vertexList[count++] = myVertex;

}

void myGraph::addEdge(int a, int b){
    adjMatrix[a][b] = 1;
    adjMatrix[b][a] = 1;

}

int myGraph::adjUnvisited(int index){
    for(int i=0; i<vertices; i++){
        if(adjMatrix[i][index]==1 && vertexList[i]->visited==false){
            return i;
        }
    }
    return -1;
}

void myGraph::displayVertex(int index){
    std::cout << "Current vertex: " << vertexList[index]->label << std::endl;
}

void myGraph::dfs(){
    std::stack<int> myStack;
    int temp = 0;

    vertexList[temp]->visited = true;

    myStack.push(temp);

    int unvisitedVertex;

    while(!myStack.empty()){
        unvisitedVertex = adjUnvisited[myStack.top()];
        if(unvisitedVertex!=-1){
            myStack.push(unvisitedVertex);
            displayVertex(unvisitedVertex);
            vertexList[unvisitedVertex]->visited = true;
        }else{
            myStack.pop();
        }
    }

}


我收到的错误消息是这样的:

没有可行的重载'='vertexList [count ++] = myVertex;

加上注释:

候选函数(隐式副本分配
      运算符)不可行:没有从'struct Vertex *'到的已知转换
      第一个参数的'const myGraph :: Vertex';用*取消引用参数
                struct Vertex {

还有一些其他错误消息(我相信这些错误消息很小,可以弄清楚):

成员引用类型'struct Vertex'不是
      指针;也许您打算使用'。'?
                if(adjMatrix [i] [index] == 1 && vertexList [i]-> visited == false){

必须调用对非静态成员函数的引用
                unvisitedVertex = adjUnvisited [myStack.top()];

现在我不确定我到底在做什么错,并且想知道这里有人可以帮助我吗。

非常感谢您的帮助!

最佳答案

您已将vertexList声明为指向Vertex的指针-这很公平,因为它将是一个数组。但这意味着该数组的每个元素都是一个Vertex结构-但是您正在访问每个数组元素,就好像它是一个指针一样。

要么:


将所有->替换为.,然后在AddVertex()中执行其他操作
vertexList声明为Vertex **(例如adjMatrix

10-08 19:57