我将我的信息存储在指向结构的指针数组中。换句话说,数组的每个元素都是指向链表的指针。
我不知道数组应该有多长,所以不是在main()函数中初始化数组,而是初始化双指针
struct graph** graph_array;
然后,一旦我获得数组的长度,我尝试使用GraphInitialize函数初始化graph_array的每个元素:
int GraphInitialize(struct graph ***graph_array, int vertices)
{
*graph_array = malloc(sizeof **graph_array * vertices);
if (*graph_array)
{
int i;
for (i = 0; i < vertices; i++)
{
(*graph_array)[i] = NULL; // parentheses matter here!
}
}
else
{
return -1;
}
return 0;
}
但问题是:我不直接从main()调用GraphIntialize。相反,我首先从main调用getdata(),并将指向graph_array的指针传递给getdata,如下所示。
getdata(argc, argv, vertpt, edgept, &graph_array)
int getdata(int argc, char *argv[], int *verts, int *edges, struct graph* **graph_array)
然后getdata从我的输入文件中检索顶点数,并使用它来调用GraphInitialize:
if ((GraphInitialize(&graph_array, *verts)) == -1)
{
printf("GraphCreate failed");
return 0;
}
这导致错误:“预期'结构图3ASTERISKS(三重指针)'但参数类型为'struct graph 4ASTERISKS(四重指针)'。这太令人困惑。如果有办法我可以解决这个问题不需要所有这些可能是最佳答案的指针,但我正在尝试创建和抽象数据类型,所以我不想在我的main函数中创建graph_array数组。
答案 0 :(得分:1)
我想,你不必使用'&amp;'这里:
if ((GraphInitialize(&graph_array, *verts)) == -1)
你想初始化一个双指针(graph**
),但要做到这一点你将指针传递给你的函数,所以它们都得到一个三指针(graph ***
)作为输入。
调用链看起来像这样(这更像是伪代码):
void GraphInitialize(struct graph *** graph_array);
void getdata(..., struct graph *** graph_array )
{
...
GraphInitialize(graph_array); //graph_array here is the same triple pointer, that 'getdata' recieved as an input, so there is no need to use '&' operator.
...
}
void main()
{
graph ** graph_array = ...; // this is a double pointer, obviously
getdata( ..., &graph_array); //getdata gets a triple pointer as an input, so we get the graph_array address by '&' operator;
}
所以正确的形式是
if ((GraphInitialize(graph_array, *verts)) == -1)
答案 1 :(得分:1)
使用
if ((GraphInitialize(graph_array, *verts)) == -1)
{
printf("GraphCreate failed");
return 0;
}
这是我希望的作品..