2013-10-21 105 views
-2

我必須使用鏈接列表(因此指針)在c中打印一個集合的列表。但是,當我刪除列表的第一個元素並嘗試打印列表時,它只是顯示了很多地址。有什麼問題可能是什麼建議?謝謝!刪除鏈接列表的第一個節點

刪除功能:

int delete(set_element* src, int elem){ 
if (src==NULL) { 
    fputs("The list is empty.\n", stderr); 
} 


set_element* currElement; 
set_element* prevElement=NULL; 

for (currElement=src; currElement!=NULL; prevElement=currElement, currElement=currElement->next)  { 
    if(currElement->value==elem) { 
     if(prevElement==NULL){ 
      printf("Head is deleted\n"); 
      if(currElement->next!=NULL){ 
       *src = *currElement->next; 
      } else { 

       destroy(currElement); 
      } 
     } else { 
      prevElement->next = currElement->next; 
     } 
     // free(currElement); 
     break; 
    } 
    } 



return 1; 
} 



void print(set_element* start) 
{ 
    set_element *pt = start; 

    while(pt != NULL) 
    { 
     printf("%d, ",pt->value); 
    pt = pt->next; 
    } 
} 
+2

很難說沒有任何代碼,但問題可能是您正在嘗試釋放其頭部進入後打印的清單。更新指向列表的指針,指向'head-> next'條目,並且您應該是golden。 –

+0

你是如何打印清單的? –

+0

您可能想閱讀[Stack Overflow問題清單](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist),它會幫助您編寫更好的問題。 –

回答

0

如果列表指針與指向第一個元素的指針相同,那麼當第一個元素爲free時,列表指針不再有效。

有兩個解決這個問題:

  1. 讓你的所有列表方法採取的指針列表,使他們能夠neccesary時更新。這種方法的問題是如果你在另一個變量中有一個指針副本,那麼這個指針也會失效。

  2. 不要讓你的列表指針指向第一個元素。讓它指向一個指向第一個元素的指針。

示例代碼:」

typedef struct node_struct { 
    node_struct *next; 
    void *data; 
} Node; 


typedef struct { 
    Node *first; 
} List; 
0

警告:這個答案包含推斷代碼。

C中的一個典型的鏈表看起來有點像這樣:

typedef struct _list List; 
typedef struct _list_node ListNode; 

struct _list { 
    ListNode *head; 
} 

struct _list_node { 
    void *payload; 
    ListNode *next; 
} 

爲了正確地從列表中刪除第一個元素,下面的序列需要發生:

List *aList; // contains a list 

if (aList->head) 
    ListNode *newHead = aList->head->next; 

delete_payload(aList->head->payload); // Depending on what the payload actually is 
free(aList->head); 
aList->head = newHead; 

這裏的操作順序非常重要!試圖在沒有先釋放舊值的情況下移動頭部會導致內存泄漏;在沒有首先獲得新頭的正確價值的情況下釋放舊頭會產生未定義的行爲。

附錄:偶爾,上述代碼的_list部分將被完全省略,從而將列表和列表節點保留爲相同的東西;但是從你描述的症狀來看,我猜這可能不是這種情況。

但是,在這種情況下,步驟基本上保持不變,但沒有aList->位。


編輯:

現在,我看到你的代碼,我可以給你一個更完整的答案。

你的代碼中的一個關鍵問題是它到處都是。然而,有,在這裏一條線這是特別糟糕:

*src = *currElement->next; 

這不工作,是什麼原因造成你的崩潰。

就你而言,解決方案是以某種容器的方式封裝鏈表,如上面的struct _list結構;或者修改你現有的代碼來接受一個指向set元素的指針,這樣你就可以傳遞指針來設置元素(這就是你想要做的)。

就性能而言,這兩種解決方案可能儘可能接近,因此毫無差別,但使用包裝列表結構有助於交流意圖。它還有助於防止其他指向列表的指針由於頭部刪除而變成亂碼,所以就是這樣。

+0

我不明白你的意思。我改變了方法,但它仍然是一樣的。 代碼: void destroy(set_element * head) { set_element * current = head; set_element * temp; (當前!= NULL) temp = current; current = current-> next; free(temp); } } – user90790

0

這通常發生在您刪除不屬於您的指針(實際上是一塊內存)時。仔細檢查你的函數,確保你沒有釋放你已經釋放的指針,或者釋放一個你沒有用「malloc」創建的指針。