2016-03-22 87 views
0

我有一個鏈接列表創建,我的目標是刪除鏈接列表中的數據重複。每個節點中只有一個數據和指針組件。該算法可能不完美,但我擔心的是爲什麼在嘗試刪除節點時在Xcode中收到錯誤SIGABRTif條件爲真時,代碼發生在代碼中。不知道SIGABRT的含義。鏈接列表SIGABRT錯誤

void LinkedList::deleteRepetition(const LinkedList& list) 
{ 
    node* temp_value = nullptr; 
    node* traverser = nullptr; 
    temp_value = head; 
    traverser = head; 
    for (int i = 0; i < NODES; i++) 
    { 
     for (int j = 0; j < NODES - i; j++) 
     { 
      traverser = temp_value->next; 
      if (traverser->data == temp_value->data) 
      { 
       delete traverser; 
      } 
     } 
     traverser = temp_value; 
     temp_value = temp_value->next; 
    } 
} 
+0

你的意思是[SIGABRT](https://en.wikipedia.org/wiki/Unix_signal#POSIX_signals)? – 3442

+0

'SIGABRT'或'SIGNAL6'表示內存中斷或訪問中斷內存。 – someone

+1

可能的重複[什麼時候進程得到SIGABRT(信號6)?](http://stackoverflow.com/questions/3413166/when-does-a-process-get-sigabrt-signal-6) – someone

回答

0

你第二個循環遍歷一些條件再次刪除元素。當你找到同樣的節點時,你需要交換指針。正確版本:

void LinkedList::deleteRepetition(const LinkedList& list) 
{ 
    node* node1 = head; 
    node* node2 = nullptr; 
    node* duplicate = nullptr; 

    while(node1 != nullptr && node1->next != nullptr) 
    { 
    node2 = node1; 

    while(node2->next != nullptr) 
    { 
     if(node1->data == node2->next->data) 
     { 
      duplicate = node2->next; 
      node2->next = node2->next->next; 
      delete duplicate 
     } 
     else 
     { 
      node2 = node2->next; 
     } 
    } 
    node1 = node1->next; 
    } 
} 

並注意next最後一個元素必須爲NULL。

+0

試過這個,它沒有奏效。不確定你的意思是「迭代移除的元素」。第一次嘗試刪除節點時發生錯誤,而不是之後。是的,這是爲了學術目的。只是FYI,NODES是一個等於10的const int,表示列表中的節點數。 –

+0

編輯答案,更改實施 – Megamozg

+0

謝謝!這很好。 –

0

在這裏你的做法是錯誤的。 Inner for循環,迭代後再次訪問相同的內存並被損壞。所以你需要在循環裏更新它。

我對同樣的辦法,也許它會幫助你

void removeDuplicates(struct node *start) 
{ 
    struct node *ptr1, *ptr2, *dup; 
    ptr1 = start; 

    /* Pick elements one by one */ 
    while(ptr1 != NULL && ptr1->next != NULL) 
    { 
    ptr2 = ptr1; 

    /* Compare the picked element with rest of the elements */ 
while(ptr2->next != NULL) 
{ 
    /* If duplicate then delete it */ 
    if(ptr1->data == ptr2->next->data) 
    { 
     /* sequence of steps is important here */ 
     dup = ptr2->next; 
     ptr2->next = ptr2->next->next; 
     free(dup); 
    } 
    else /* This is tricky */ 
     { 
     ptr2 = ptr2->next; 
     } 
    } 
    ptr1 = ptr1->next; 
    } 
} 

使用while循環我試圖以節省時間用於檢查,我們可以忽略