我以前玩过 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/