2012-11-19 43 views
2

我有一個任務,用C編寫Graph ADT,它實現了運行寬度優先搜索。當我調用圖析構函數時,我得到:分段錯誤(核心轉儲)。圖C中的ADT析構函數C

Graph ADT使用一個List數組來表示相鄰的頂點。 數組中的元素編號與該頂點的數字標籤相同。

Graph ADT有3個數組字段,顏色,距離和父項。數組中的每個第i個元素都是頂點的數字標籤,存儲在該索引處的數據可以是顏色的表示(對於BFS),也可以是與BFS中使用的源頂點的距離,也可以是該頂點的直接父項頂點。 每個數組的初始化如下:

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

「N」是數G.

這裏一個頂​​點是我試圖實現析構函數:

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; 
} 

我不確定我做錯了什麼。任何建議將不勝感激!

+0

可以共享特定的空閒列表的代碼;我在當前的代碼中找不到任何問題。 – Viswesn

回答

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; 
} 
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代碼以更好地幫助您。