2013-12-01 5 views
2

Предполагается удалить все узлы, содержащие данные «last», которые совпадают с строкой «name». Это не дает мне ошибку, но она не работает должным образом. Она удаляет больше, чем нужно удалить.C - Связанный список - Удалить узел

struct node* mydelete(struct node *head) 
{ 
    char name[21]; 
    struct node *temp; 
    printf("---Please enter last name:"); 
    scanf("%s",&name); 
    while(head->next!=NULL) 
    { 
     if(strcmp(head->last,name)==0) 
     { 
      temp = head; 
      head = head->next; 
      free(temp); 
      n--; 
     } 
     else if(strcmp(head->next->last,name)==0) 
     { 
      temp = head->next; 
      head->next = head->next->next; 
      free(temp); 
      n--; 
     } 
     else 
      head = head->next; 
    } 

    return head; 
} 
+0

ли вы опубликовать тестовый случай, и результат выполнения? – poiu2000

+0

Я пытаюсь удалить все узлы, содержащие «имя» – user3053814

ответ

1
return head 

не соответствует действительности. Когда вы двигаете голову вперед (к «следующей»), все, что она пропустит, будет потеряно - возможно, вы не освободите некоторых из них, но вы больше не сможете их получить. Вы должны использовать указатель temp для хранения первого узла в списке (после удаления) и, наконец, вернуть его.

И, не забудьте, если head == NULL.

.

Измененный код:

struct node *first = NULL; 
while(head != NULL) 
{ 
    if(strcmp(head->last,name)==0) 
    { //delete head 
     temp = head; 
     head = head->next; 
     free(temp); 
     n--; 
    } 
    else 
    { //delete head->next 

     if (first == NULL) 
      first = head; 

     if (head->next == NULL) 
      break; 

     if(strcmp(head->next->last,name)==0) 
     { 
      temp = head->next; 
      head->next = head->next->next; 
      free(temp); 
      n--; 
     } 
     else 
      head = head->next; 
    } 
} 

return first; 
+0

Спасибо, человек, вы мне очень помогли. – user3053814

+0

@ user3053814 У меня была ошибка: «хлеб» должен быть «сломан». Код исправлен. – SliceSort

0

Во-первых, ваш код выходит из строя, если вы звоните с head == NULL, который может очень хорошо произойти (если список пуст). Итак, проверьте это. Во-вторых, нет причин, по которым вам нужно проверить строку name на два разных узла списка. Просто пропустите ветку else if. В-третьих, если вы хотите удалить только один узел, который соответствует вашему тесту, а затем выйдите из цикла while после его удаления.

0

Вам не нужно условие else if в вашем коде удаления. Если удаляется более одного элемента, это означает, что ваш list содержит более одного элемента с тем же именем. Сначала проверьте содержимое вашего list.

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