我正在尝试用C学习图形,目前我正在尝试编写一个用给定数据结构初始化图形的函数。 所以我的结构是:
typedef struct linked list{
int index;
struct linked list *next;
} List;
typedef struct {
char *name;
List *outlist;
int outdegree;
} Node;
typedef struct {
int maxSize;
Node *table;
} Graph;
我有三个功能:
int initialise_graph(Graph *mygraph, int maxSize)
{
}
int insert_graph_node(Graph *mygraph, int n, char *name)
{
}
int insert_graph_link(Graph *mygraph, int source, int target)
{
}
我目前正在努力解决第一个问题。 我知道我必须为第一个函数中的每个数据结构分配内存,但我不知道如何通过for循环malloc为每个结构的内存。如果有人可以帮助我,我感激不尽。
答案 0 :(得分:0)
我目前正在努力解决第一个问题。我知道我必须为第一个函数中的每个数据结构分配内存,但是我不知道如何通过for循环来为每个结构的内存进行malloc
由于您的Graph对象具有maxSize
成员且指向Node
且Node
的单个指针中没有链接,因此您可以明确分配和初始化数组节点。
您最初的空图表中的所有未使用节点都需要合理的值。我建议NULL
表示名称(尚未指定),NULL
表示outlist
(即它为空),0
表示outdegree
。
我会通过为分配空间的calloc调用calloc并将该空间中的所有字节归零来实现此目的。
int initialise_graph(Graph *mygraph, int maxSize)
{
mygraph->maxSize = maxSize;
mygraph->table = calloc(maxSize, sizeof *table);
return 0;
}
就是这样,你已经完成了。
然而:
table
是否为空。 Opinioins在这方面有所不同,通常我依靠平台的内存保护来捡起它,但如果你在嵌入式世界中,那可能行不通。上述代码严格来说不是可移植的,因为NULL
指针不需要用所有零字节的模式表示。如果这与您有关,请使用循环初始化节点。 (再次省略NULL检查)。
mygraph->table = calloc(maxSize, sizeof *table);
// Null check would go here
for (i = 0 ; i < maxSize ; ++i)
{
table[i].name = NULL;
table[i].outlist = NULL;
table[i].outdegree = 0;
}