2013-08-29 2 views
0

Мой код работает для элементов, которые находятся в начале связанного списка, но не для тех, которые находятся в середине или в конце. Ценю вашу помощь!Удаление элемента из двусвязного списка

void remove(){ 
    if (!head) 
     printf("\nNo nodes to delete. List is empty."); 
    else{ 
     int n; 
     struct node* help = head; 
     printf("Enter an element to delete: "); 
     scanf("%d", &n); 
     if(head->data == n){ 
      help-> next->prev = 0; 
      head = help -> next; 
     } else{ 
      while(help -> next){ 
       if(help -> data == n){ 
        help -> next -> prev = help -> prev; 
        help -> prev -> next = help -> next; 
       } 
       else help = help -> next; 
      } 
     } 
    } 
} 
+0

Почему не существует 'n' в качестве параметра' remove() '? –

+0

@ смысл-вопрос, почему люди всегда выбирают код вместо ответа на поставленный вопрос? Ваш вопрос не имеет никакого отношения к заданной проблеме, и опубликованный код может быть упрощен для публикации в SO - не так, как он был фактически написан для фактического проекта со стороны искателя. – xaxxon

+0

@shail, дающий нам конкретные примеры того, как он провалился, был бы полезен, так как у вашего кода много проблем, и сложно указать их на все, не переписывая свой код для вас (что не должно быть сделано на SO) – xaxxon

ответ

1

Во-первых, используйте NULL, а не 0 для значения NULL. В C вам нужно. В C++ это необязательно, но помечено вопрос C.

help-> next->prev = 0; 

Вы никогда не проверить, если есть второй элемент. Если в списке только один элемент, это не удается - поэтому он не всегда работает для первого элемента.

 while(help -> next){ 
      if(help -> data == n){ 

Это остановит вас от когда-либо удалить последний элемент, так как вы не смотреть на список, как только вы получите (но прежде, чем вы имеете дело с) последний элемент. Но даже если вы не сделали, следующие строки:

   help -> next -> prev = help -> prev; 
       help -> prev -> next = help -> next; 

приведет к сбою, если это последний, так как он не проверяет, что есть еще один элемент после.

Кроме того, пробелы до и после стрелки -> довольно необычны. Я бы предложил больше не делать этого.

+0

Спасибо, что указали эти проблемы. Я попытаюсь исправить свой код. – Shail

+0

Должен ли я добавить условие if (только выполнить, если следующий не равен null) для выполнения help-> next-> prev = NULL ;? Кроме того, следует ли мне изменить мое состояние во время (помощи)? Однако я не могу понять, как изменить код внутри цикла while. – Shail

+0

@Shail да. там будет много условий – xaxxon

0
struct node *head, *tail; //global head & tail 

int delete_item() { 
    int del_data = 0; 
    struct node *item = head, *tmp; 
    scanf("%d", &del_data); 
    while(item){ 
     if(item->data == del_data){ 
      tmp = item; 
      if(item->next){ 
       //it's not tail 
       item->next->prev = item->prev; 
      } 
      else { 
       //it's tail 
       tail = item->prev; 
       if(tail) 
        tail->next = NULL; 
      } 
      if(item->prev){ 
       //it's not head 
       item->prev->next = item->next; 
      } 
      else { 
       //it's head 
       head = item->next; 
       if(head) 
        head->prev = NULL; 
      } 
      //free memory 
      free(tmp); 
     } 
     //move forward 
     item = item->next; 
    } 
return 0; 
} 
+2

Выполнение домашних заданий для людей на них неодобрительно. – xaxxon

+1

Если он попытается понять этот код, тогда все будет в порядке. Не будь таким скучным. – someuser

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