2010-03-14 61 views
2

我編程C在VC++ 2008中的一個assingment我模擬adjList的圖形實現。我可以在兩個頂點之間閱讀添加邊並打印圖形。 我想刪除兩個頂點之間的邊並再次打印圖。無論我做什麼,我都無法在刪除邊緣後打印圖形。我得到0xfeefee :(這是什麼?我如何才能解決這個節目。我怎樣才能擺脫0xFEEFEE在VC

我刪除功能和打印圖形功能如下所示。

void deleteEdge(Graph G, Vertex V, Vertex W) 
{ 
Edge list,prev,temp; 
list=V->list; 
    prev=NULL; 
    // 
    while(list!=NULL && list->to->value!=W->value){ 
    prev=list; 
    list=list->next; 
    } 
    // have found the element. 
    if(list!=NULL){ 
    temp=list; 
    // if first element of list is deleted. 
    if(prev==NULL) 
    list=list->next; 
    else 
    prev->next=list->next; 

    // reallocate. 
    free(temp); 

    } 
} 




    void GRAPHprint(Graph G) 
    { 
    Vertex tmp; 
    Edge list; 
    for(tmp = G->head;tmp!=NULL;tmp=tmp->next) 
    { 
     fprintf(stdout,"V:%d\t",tmp->value); 
     list=tmp->list; 
     while(list!=NULL) 
     { 

     fprintf(stdout,"%d\t",list->to->value); 
     list=list->next; 

     } 
     fprintf(stdout, "\n"); 
    } 
    system("pause"); 
    } 
+3

'0xfeeefeee'是一個標誌,在Windows上運行調試版本時,會釋放內存空間(請參閱http://www.nobugs.org/developer/win32/debug_crt_heap.html)。 – 2010-03-14 22:30:12

回答

4

在你的代碼,如果你匹配,因此嘗試刪除列表中的第一邊緣,那麼你最終會提領您已釋放的指針。

list=list->nextV->list=list->next,否則你實際上只更新您的本地列表(list),而不是輸入的列表(V->list) 。

0xfeeefeee表示您正在讀取堆中已刪除的內存,即您正在取消引用您之前稱爲空閒的指針。這隻發生在調試模式下,它有意幫助你解決這類問題!有關此幻數(及其他)的更多信息,請參閱此wikipedia entry

1

當你刪除的邊緣是V->list中的第一個元素時,這個V->list指針將一直指向釋放的元素。

prev==NULL大小寫正在試圖解決這個問題,但是您只是將臨時本地list指針提前到下一個元素。您應該更改V->list而不是調整主數據結構。

相關問題