Typedef数组引用?

时间:2016-06-14 02:50:56

标签: c++ arrays graph typedef

您好我对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;

还有一个注释:

候选函数(隐式复制赋值       operator)不可行:没有已知的'struct Vertex *'转换为       第一个参数的'const myGraph :: Vertex';用*取消引用参数                 struct Vertex {

还有其他一些错误消息(我确定这些消息非常小,我可以解决它们):

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

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

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

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

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

或者:

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