c - 在 C 中使用邻接列表初始化基于数组的图形时出现问题

标签 c pointers graph initialization structure

我以前玩过 Graphs,在 StackOverflow 的帮助下我管理得很好,但我从未使用过像下面这样的结构。我似乎无法理解我在这里做错了什么......

#include "stdio.h"
#include "stdlib.h"

#define MaxV 100
#define MaxE 50

typedef struct edge {
    int dest;
    int cost;

    struct edge *next;
} Edge, *Graph[MaxV];

Graph *initGraph() {    
    Graph *g = (Graph*)malloc(sizeof(Edge) * MaxV);

    for(int i = 0; i < MaxV; i++)
        (*g[i])->next = NULL;

    return g;
}

int main(void) {
    Graph *g = initGraph();

    for(int i = 0; i < MaxV; i++) {
        if((*g[i])->next == NULL) printf("[%02d] NULL\n", i);
    }

    return 0;
}

我在 (*g[i])->next = NULL; 的第一次迭代中遇到段错误,我不明白为什么。我已经尝试了无数的事情,但我似乎无法使用这种结构来管理 Graph 初始化。另外,我声明和返回指向图形的指针的方式是否适合此结构?

我是不是在 init 函数中使用大量指针使事情变得复杂?

P.S: 请不要建议不同的结构定义,我无法更改上面的任何内容。这才是真正的问题。我知道如何使用 Graphs 滚动我自己的结构,但我需要使用上面的结构。

最佳答案

我真的不明白你的 *Graph[MaxV] 的第二个 typedef。

我要做的是声明另一个结构如下:

typedef struct graph {
    Edge *edges;
} Graph;

然后你可以初始化图如下:

Graph *initGraph() {  
    Graph *g = (Graph*)malloc(sizeof(Graph));

    g->edges = (Edge*)malloc(sizeof(Edge) * MaxV);
    for(int i = 0; i < MaxV; i++)
        g->edges[i].next = NULL;

    return g;
}

打印出来的图形如下:

for(int i = 0; i < MaxV; i++) {
    if(g->edges[i].next == NULL) printf("[%02d] NULL\n", i);
}

我想您会发现,随着时间的推移,为图形添加一个额外的结构也将证明更具可持续性。 :)

关于c - 在 C 中使用邻接列表初始化基于数组的图形时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4904042/

相关文章:

c++ - OpenGL:无法绘制由存储在 SSBO 中的计算着色器生成的顶点

c - "if "和 "#if ";哪个更好用

c++ - 使用图形库/节点网络库还是自己编写?

ios - 使用 iOS 图表绘制多条线

c - 从 char 数组中解析 int

c++ - 预编译头是递归的吗?

c++ - 使用 C++ API 开发 Google Pepper 可信插件时如何设置链接器标志

c++ - 打印出指针列表

c++ - 释放指针 vector 的两种不同方法——为什么一种方法不起作用?

c - 将函数传递给函数时,错误左值需要作为一元 '&' 操作数