2013-07-09 3 views
0

Я изучаю связанные списки в C, и у меня проблема с моей функцией удаления, которая дает мне ошибку сегментации. Я не знаю, что не так с кодом.Связанный список Ошибка сегментации C

void delete(int d) 
{ 
    struct list * current1 = head; 
    struct list * current2; 

    if (len() == 0) 
    { //prtError("empty"); 
     exit(0); 
    } 
    if (head -> data == d) 
    { 
     head = head -> next; 
    } 

    //Check if last node contains element 
    while (current1->next->next != NULL) 
     current1 = current1->next; 
    if(current1->next->data == d) 
      current1->next == NULL; 


    current1 = head; //move current1 back to front */ 

    while(current1 != NULL && (current1->next->data != d)) 
     current1 = current1 -> next; 


    current2 = current1 -> next; 
    current1 -> next = current2 -> next; 
} 
+2

Этот же вопрос был дважды спросил в течение последних 30 минут. – Jashaszun

+0

Если вы используете компилятор C++ (например, Visual C++) для компиляции этого кода - проверьте некоторые проблемы с вашей функцией с именем 'delete'.Это зарезервированное ключевое слово –

+0

Кажется, что 'current1' может быть' NULL' в этой строке 'current2 = current1 -> next;' – imreal

ответ

0

От быстрого проблеска:

Допустим, есть 100 Структуры в диапазоне от 1 ~ 99.
100-й будет быть (возможно) NULL.


while(current1 != NULL && (current1->next->data != d)) 

Когда код выше достигает 99th структуры. Вы выполняете 2 проверки.

1) Проверьте, если 99-й не NULL .. возвращает истину
2) Проверьте, если данные 100ths отличается от д

Но нет сотой структуры.
Это приводит к неопределенному поведению, которое COULD и, возможно, WOOD ведут к segfault.

+0

Спасибо, но я все еще получаю ошибку при current1-> next = current2-> next; – Sophie

0

Это неправильно во многих отношениях:

1)

while (current1->next->next != NULL) 

Если список содержит только один элемент:

current1 = head; 
current1->next = NULL; 
current1->next->next = Seg Fault 

2)
Если вы собираетесь если последний элемент имеет предоставленные данные, убедитесь, что вы вернулись из функции после его поиска, а также освободите память для него:

while(current1->next->next != NULL) 
    current1 = current1->next; 
if(current1->next->data == d){ 
     free(current->next); 
     current1->next == NULL; 
     return; 
} 


3)
Если вы ищете, как указано выше, если последний элемент имеет свои данные (хотя и бессмысленный поиск; не нужно делать это отдельно), вы устраняете ошибку из кода ниже. Но у вас все еще будет ситуация, когда ваши данные не могут быть найдены в списке, а current1 позиционируется на последнем элементе (так != NULL), но current1->next->data != d с крахом вашей программы. Это произойдет, если вы не вернетесь из функции в точке 2).

current1 = head; //move current1 back to front */ 
while(current1 != NULL && (current1->next->data != d)) 
    current1 = current1 -> next; 


4)
свободной памяти для удаленного узла:

current2 = current1 -> next; 
current1 -> next = current2 -> next; 
free(current2);