使用C 中的邻接列表在图中添加顶点

Adding of a vertex in graph using adjacency-list in c++

本文关键字:添加 列表 顶点 使用      更新时间:2023-10-16

这就是我定义图形的方式。这不是典型的图表,它特定于我要处理的问题类型。

class Vertex;
class Edge
{
public:
    Vertex *org;
    Vertex *dest;
    bool dir;
};
struct Vertex{
    int id;
    vector<Edge> edges;
    int weight;
};
struct Graph{
    vector<Vertex> vertices;
};

我在图中添加顶点时遇到问题。这就是我的做法

Graph* graph1;
Vertex* first = addVertex(0);
graph1->vertices.push_back(*first);

AddVertex函数正常工作,但是如果您仍然想引用,这里是

Vertex* addVertex(int id){
    Vertex*newVertex = new Vertex;
    newVertex->id=id;
    newVertex->weight=0;
    return newVertex;
}

函数在Graph1-> Vertices.push_back(*first);

之前停止工作。

graph1本身是一个统一的指针。因此,称其为会员正在导致该程序崩溃。用new操作员初始化它。

graph1 = new Graph();
// .......
delete graph1;

或使用std::unique_ptr这样的智能指针自动管理内存。

除了非初始化的Graph* graph1,您的代码中还有另一个内存管理问题:

addVertex在其自己的堆内存块中分配一个Vertex。但是

graph1->vertices.push_back(*first);

副本 first进入由graph1std::vector管理的内存块。

我想您是来自Java或Python等另一种语言的C 的新手。您应该阅读一本介绍性C 书。与其他语言相比,C 中的内存管理具有许多陷阱和概念。