我见过很多邻接列表的实现在这里,我尝试使用C++实现它。从我的c++结构可以看出,我是一个完全不懂c++的新手在这里,我正在努力让我的代码运行。我现在的问题是,它没有贯穿整个图表我有一个分割错误。
结果:
顶点:0
1->
顶点:1
2->3->
顶点:2
顶点:3
顶点:4
分段故障
我需要一些帮助来运行这个我想实现DFS算法任何提示都很好!!!
这里是标题:

#ifndef DFS_H
#define DFS_H

class DFS{
private:
    struct vertex{
        int data;
        bool visited;
        struct vertex* next;
    };
    int V;
    struct vertex* G[20];
public:
    DFS(int vertices);
    vertex* addVertex(int data);
    void addEdge(int index, int data);
    void dfs(int vertex);
    void printGraph();
};

#endif

cpp文件:
#include "DFS.h"
#include <iostream>
#include <cstdlib>
using namespace std;
DFS:: DFS(int vertices){
    this->V=vertices;
    for(int i=0; i<V; i++){
        G[i]= NULL;
    }
}
DFS::vertex* DFS::addVertex(int data){
    struct vertex* newNode= new vertex;
    newNode->data= data;
    newNode->next= NULL;
    newNode->visited=false;
    return newNode;
}
void DFS:: addEdge(int index, int data){
    struct vertex* cursor;
    struct vertex* newVertex= addVertex(data);

    if(G[index]==NULL)
        G[index]=newVertex;
    else{
        cursor=G[index];
        while(cursor->next!=NULL)
            cursor=cursor->next;
        cursor->next= newVertex;
    }
}
void DFS::printGraph(){
    for(int i=0; i<V; i++){
        struct vertex* cursor= G[i];
        cout<<"vertex: "<<i<<endl;
        while(cursor->next!=NULL){
            cout<<cursor->data<<"->";
            cursor=cursor->next;
        }
        cout<<endl;
    }
}
void DFS:: dfs(int vertex){
}
int main(){
    DFS dfs(5);
    dfs.addEdge(0,1);
    dfs.addEdge(0,4);
    dfs.addEdge(1,2);
    dfs.addEdge(1,3);
    dfs.addEdge(1,4);
    dfs.addEdge(2,3);
    dfs.addEdge(3,4);

    dfs.printGraph();
    return 0;
}

*
感谢您对Stackoverflow社区的帮助!

最佳答案

segfault来自于printGraph它假设所有的V顶点都存在,这在您的情况下是不正确的注意没有初始化第五个顶点。
一般来说,长度必须与稍后设置的元素数匹配的方法是自找麻烦的,我将使用dfs.addEdge(4, ...)来重构此代码以进行存储。
另一个问题是vector总是实例化一个新的addEdge,这意味着vertexdfs.addEdge(1,3)之后,顶点1和2将指向顶点3的不同实例。
另一件事是:dfs.addEdge(2,3)addEdge(1,2)会留下边1->2和2->3。我假设结果应该是边1->2和1->3。
更何况,从addEdge(1,3)返回一个裸露的new ED指针要求内存泄漏;我建议使用addVertexauto_ptr如果你在C++ 11)。
另一件事是当unique_ptr可用时,您正在重新实现前向链接列表。
这些只是我通过查看你的代码发现的一些问题。我敢肯定还有更多,因为说实话,它看起来很糟糕(无意冒犯,我们都是初学者)。我建议@Beta所说的:一次只学习和练习一件事(构建一个顶点列表,当你对如何表示边感到满意时,然后尝试遍历它,构建一个简单的算法,等等)。

10-08 17:52