2016-12-09 3 views
-2

Я работаю над двусвязным списком в c, у меня есть двусвязный tepm2 с 20 узлами, и я хочу удалить узел, в который вставляется слово пользователя.Как удалить узел из дважды связанного списка в c

struct node 
{ 
    struct node *prev; 
    char word[100]; 
    int repeatTime; 
    struct node *next; 
}*h, *temp, *temp1, *temp2; 

Каждый узел имеет уникальное слово.

printf("\n Enter word to delete : "); 
scanf("%s", &word); 
Delete(word); 

int delete(char data[200]) //unable to delete 
{ 
    if (h == NULL) return; 

    temp2 = next = previous = h; 

    while (temp2->next != NULL) 
    { 
     if ((strcmp(temp2->word, data) == 0)) 
     { 
      if (temp2->prev == NULL) 
      { 
       h = temp2->next; 
       free(temp2); 
       return; 
      } 
      else if (temp2->prev == NULL) 
      { 
       previous->next = temp2; 
       free(temp2); 
       previous->next = NULL; 
       return; 
      } 
      else 
      { 
       previous->next = temp2->next; 
       next->prev = temp2->next; 

      } 
     } 
     temp2 = temp->next; 
    } 
} 

Я не смог удалить конкретный узел, который пользователь слово ввести

+1

Почему вы тестируете два идентичных условия? 'if (temp2-> prev == NULL)' и 'else if (temp2-> prev == NULL)' – yLaguardia

+0

У меня была копия этой функции удаления, но я не могу понять ее логику. –

+0

Лучше выбросьте ее и попробуйте написать свой собственный. –

ответ

0

Попробуйте это:

int delete(const char *data) 
{ 
    struct node *temp = h; 

    if (h == NULL) return; 

    while (temp->next != NULL) 
    { 
     if (strcmp(temp->word, data) == 0) 
     { 
      if (temp->prev != NULL) 
      { 
       temp->prev->next = temp->next; 
      } 
      if (temp->next != NULL) 
      { 
       temp->next->prev = temp->prev; 
      } 
      if (h == temp) 
      { 
       h = temp->next; 
      } 
      free(temp); 
      return; 
     } 
     temp = temp->next; 
    } 
} 
+0

@lan это не работает для меня ... –

+1

@UsfNoor Для этого может быть несколько причин. Возможно, дважды связанный список, на который указывает 'h', в действительности не построен, или, возможно, слово, которое вы пытаетесь удалить, отсутствует в списке! –

0

Прежде всего, я не думаю, что это правильно temp2 = next = previous = h;

Теперь все, что вам нужно сделать, это найти узел, который вы хотите удалить, пройдя через него и связав его с предыдущим узлом, следующим его узлом, т.е. (temp2-> prev) -> next = next и (temp2-> next) -> prev = предыдущая и освободить его.

Теперь реальная проблема заключается в 1. Первого узла, который имеет другие узлы после 2. последнего узла, который имеет другие узлы, предшествующие ему 3. только узел

Вы можете упростить все три путем преобразования их в первую проблему, т.е. узел в средней проблеме, который мы только что решили.

Для упрощения вы можете просто сделать голову и хвост как NULL.