1

我将我的信息存储在指向结构的指针数组中。换句话说,数组的每个元素都是一个指向链表的指针。

我不知道数组应该有多长,所以不是在我的 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;
    }

这会导致错误:“预期的'struct graph 3ASTERISKS(三重指针)'但参数的类型是'struct graph 4ASTERISKS(四重指针)'。这太令人困惑了。如果有办法我可以解决这个问题而不需要所有这些指针可能是最好的答案,但我正在尝试创建和抽象数据类型,所以我不想在我的主函数中创建一个 graph_array 数组。

4

2 回答 2

1

我想,你不必在这里使用'&':

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)
于 2012-11-28T04:32:31.177 回答
1

采用

if ((GraphInitialize(graph_array, *verts)) == -1)
    {
    printf("GraphCreate failed");
  return 0;
}

我希望这有效..

于 2012-11-28T04:55:21.413 回答