我见过很多邻接列表的实现在这里,我尝试使用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
,这意味着vertex
和dfs.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指针要求内存泄漏;我建议使用addVertex
(auto_ptr
如果你在C++ 11)。
另一件事是当unique_ptr
可用时,您正在重新实现前向链接列表。
这些只是我通过查看你的代码发现的一些问题。我敢肯定还有更多,因为说实话,它看起来很糟糕(无意冒犯,我们都是初学者)。我建议@Beta所说的:一次只学习和练习一件事(构建一个顶点列表,当你对如何表示边感到满意时,然后尝试遍历它,构建一个简单的算法,等等)。