在c ++中使用Adjacency List的图表

时间:2013-07-29 16:57:13

标签: c++ list graph structure adjacency-list

我正在尝试用C ++实现图形。我使用包含两个变量的结构来表示图中的节点 -
a)一个整数,用于包含有关节点的一些信息。
b)包含与其连接的其他顶点的索引的列表。
以下是代码。

// Graphs using adjacency list

#include <iostream>
#include <list>
#include <cstdlib>
using namespace std;

// structure to represent a vertex(node) in a graph
typedef struct vertex{
    int info;
    list<int> adj;   // adjacency list of edges contains the indexes to vertex
} *vPtr;             

int main(){
    vPtr node = (vPtr)malloc(sizeof(struct vertex));
    node->info = 34;            // some arbitrary value
    (node->adj).push_back(2);   // trying to insert a value in the list
    return 0;
}

代码编译正常,但是当我推回列表中的元素时,我遇到了运行时错误。我的结构有什么问题吗?
我使用代码块和GNU GCC,C ++ 98编译器来编译我的代码。

3 个答案:

答案 0 :(得分:10)

malloc是一个C函数 - 它不应该与C ++对象一起使用,which is very well explained here (简答:在C ++中,当你不处理POD类型时,在您的情况下,std::list,您必须调用对象的构造函数以使实际对象可供使用,malloc()不会这样做。

You should used new instead。虽然malloc仅分配大小为vertex的内存块,但new会执行此操作,并且还会通过调用它的构造函数初始化std::list(有趣的是,当您调用{时} {1}},你正在调用你的对象的析构函数。)

这是一段适合您案例的代码,虽然我建议您开始在C ++项目中使用更多C ++功能:

delete()

答案 1 :(得分:4)

一些事情。

  1. 因为您使用的是malloc,所以不会调用constructor 从来没有构建过非原始成员adj NULL。
  2. 您正在泄漏内存,因为您从未释放/删除任何动态分配的内存。

  3. 如果您使用的是C ++,为什么使用malloc代替newdelete

  4. 您不必在sizeof for C ++中说结构顶点。

  5. 要修复它,你可以这样做:

    vPtr node = new struct vertex(); // also change to delete instead of free
    

    // use current malloc line, change adj to be a pointer to a list and new it
    // but this will cause additional problems for you since you really need to use a constructor for STL::list
    node->adj = new list<int>;
    

    你不应该在这里使用malloc

答案 2 :(得分:2)

这是UpAndAdam的答案,完全写完。

// Graphs using adjacency list
//
#include <iostream>
#include <list>
#include <cstdlib>
using namespace std;

// structure to represent a vertex(node) in a graph
typedef struct vertex{
    int info;
    list<int> *adj;   // adjacency list of edges contains the indexes to vertex
} *vPtr;             

int main(){
    vPtr node = (vPtr)malloc(sizeof(struct vertex));
    node->adj = new list<int>;
    node->info = 34;            // some arbitrary value
    (node->adj)->push_back(2);  // trying to insert a value in the list
    return 0;
}