2

我有一个任务是用 C 编写一个 Graph ADT,它实现了运行广度优先搜索。当我调用 Graph 析构函数时,我得到:分段错误(核心转储)。

Graph ADT 使用列表数组来表示相邻顶点。数组中的元素编号与该顶点的数字标签相同。

Graph ADT 有 3 个数组字段,颜色、距离和父级。在每个数组的第 i 个元素中,顶点的数字标签和存储在该索引处的数据要么是颜色的表示(对于 BFS),要么是与 BFS 中使用的源顶点的距离,要么是该顶点的直接父节点顶点。这些数组中的每一个都按如下方式初始化:

G->color = calloc(n+1, sizeof(int));

'n' 是 G 中的 a 顶点数。

这是我尝试为析构函数实现的内容:

void freeGraph(GraphRef* pG){
    int i;
    int n = getOrder(*pG) /* the number of vertices in pG */
    for(i = 1; i <=n; i++){
        freeList((*pG)->adj[i]); /*free the list containing i's adjacent vertices*/
    }
    free((*pG)->color);
    free((*pG)->distance);
    free((*pG)->parent);
    *pG = NULL;
}

我不确定我做错了什么。任何建议将不胜感激!

4

2 回答 2

2

您的问题可能是您在 adj 数组中从 1 迭代到 n 。在 C 中,数组的索引从 0 到 n-1。尝试:

for(i = 0; i <n; i++){
    freeList((*pG)->adj[i]); /*free the list containing i's adjacent vertices*/
}

如果这能解决您的问题,请告诉我们。如果没有,请按照 Viswesn 的建议分享 freeList 代码,以更好地帮助您。

于 2012-11-19T07:05:01.113 回答
0

感谢您的反馈意见!在我的情况下,我忽略了所有数组的第 0 个元素,以便它们的索引可以表示每个顶点整数标签(从 1 开始)。

我更改了我的代码如下,它似乎正在工作:

void freeGraph(GraphRef* pG){
    if(pG == NULL || *pG == NULL){
        return;
    }
    int i;
    int n = getOrder(*pG) /* the number of vertices in pG */
    for(i = 1; i <n+1; i++){
        if((*pG)->adj[i] != NULL){
            freeList((*pG)->adj[i]); /*free the list containing i's adjacent vertices*/
        }
    }
    free((*pG)->color);
    free((*pG)->distance);
    free((*pG)->parent);
    (*pG)->color = NULL;
    (*pG)->distance = NULL;
    (*pG)->parent = NULL;
    free(*pG);
    *pG = NULL;
}
于 2012-11-19T07:16:54.970 回答