2017-03-22 86 views
0

我试图学习C中的图形,此刻我试图编写一个函数,用给定的数据结构初始化图形。 所以我有结构是:如何在初始化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分配内存。我很感激,如果有人能帮助我请。

+1

_I'm当前与第一功能..._挣扎:显示你正在挣扎的代码,否则我们很难告诉你什么是错的。 –

+1

C中的符号名称('struct linked list')中确实不能有空格,在大多数其他编程语言中也不能。 – unwind

+0

我试图编写第一个函数,它是int initialise_graph(Graph * mygraph,int maxSize) –

回答

0

我目前正在与第一功能挣扎。我知道,我必须在第一个函数中的每个数据结构分配内存,但我不知道如何通过malloc的每个结构中的记忆回路

由于您的图形对象有一个maxSize成员,一个指向NodeNode的单指针没有链接,其目的显然是为你分配和初始化一个节点数组。

你需要在你最初是空的图表对所有未结点有意义的值。我建议为outdegreeNULL的名称(未指定尚未),NULLoutlist(即它是空的)和0

我会通过调用其分配在太空空间和零所有字节的节点释放calloc做到这一点。

int initialise_graph(Graph *mygraph, int maxSize) 
{ 
    mygraph->maxSize = maxSize; 
    mygraph->table = calloc(maxSize, sizeof *table); 
    return 0; 
} 

就是这样,你完成了。

但是:

  • 你可能想在把一些代码来检查table非空。意见在这方面有所不同,通常我依靠平台的内存保护来提取它,但是如果您处于嵌入式世界,那可能无法工作。
  • 上面的代码没有严格地说便携式由于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; 
    } 
    
+0

这是一个完美的答案,非常感谢!我是否需要为其他2种插入方法遵循相同的策略? –

+0

不,对于insert_graph_node,您需要选择表中的空元素并填写详细信息。对于onsert_graph_link,您需要使用malloc创建一个List对象并将其添加到相关节点。 – JeremyP