2016-03-22 2 views
0

У меня есть связанный список, и моя цель - удалить повторение данных в связанном списке. В каждом узле есть только компонент данных и указателей. Алгоритм может быть не идеальным, но я беспокоюсь, почему я получаю ошибку SIGABRT в Xcode при попытке удалить узел. Ошибка возникает в коде, когда условие if истинно. Не знаю, что означает 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 - это константа int, равная 10, представляющая количество узлов в списке. –

+0

Отредактированный ответ, измененная реализация – Megamozg

+0

Спасибо! Это получилось великолепно. –

0

Здесь ваш подход неправильный. Внутренний цикл, после повторного обращения к той же памяти и повреждения. Так что вам нужно обновить его внутри цикла.

Мой подход такой же, Может быть, это поможет вам

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

Использование во время цикла я пытаюсь сэкономить время для проверки некоторого условия, которые мы можем игнорировать

Смежные вопросы