2014-03-07 5 views
0

Я пытаюсь удалить узел в двусвязном списке, но проблема в том, что когда у меня есть список: 7-6-5-4-3-2-1, и попробуйте удалить 3, я получаю 7-6-5-4-3, я не могу понять ошибку. Пожалуйста помоги!Дублированный список: удалить узел

void RemoveItem(int itm) 
{   
    if (Head->item == itm) { 
     Head = Head -> Next;  
     cout<<"\nItem is at 1st node & removed\n";flag=1; 
    } 
    else if (Head->Next == NULL) {   
     cout<<" \n This is 1-node list & item not in it\n"; 
    } 
    else {     
     node *current, *del = Head; 
     while(del->Next != NULL && del->item != itm) { 
      del = del->Next; 
     } 
     current = del; 
     current->Next = del->Next; 
     del->Next->previous = current; 
     delete(del); 
     del->Next = NULL; 
     flag = 1; 
    } 
} 

ответ

0

Чтобы удалить узел, перебирать, пока не будет достигнут узел удаления дель затем установить: псевдокод:

del.prev.next = del.next 

и

del.next.prev = del.prev 
+0

Это не сработало, так же, как и раньше. :/ –

+0

@AliZahr Избавьтесь от всего остального, включая установку тока для удаления и просто используйте эту логику –

+0

Я сделал, но теперь я попадаю в бесконечный цикл:/ Вот код: while (del-> Next! = NULL && del-> item! = itm) { del = del-> Next; } del-> Next-> previous = del-> previous; del-> previous-> Next = del-> Next; удалить (del); –

0

Это не имеет никакого смысла:

current = del; 
current->Next = del->Next; 

, потому что это то же самое, как

del->Next = del->Next; 

Попробуйте что-то вроде этого

// some global int flag = 0 
// some global node* Head pointing to head of list 

void RemoveItem(int itm) {   
    if (Head->item == itm) { 
    node* del = Head; 
    Head = Head -> Next; 
    delete(del);  
    cout<<"\nItem is at 1st node & removed\n"; 
    flag=1; 
    return; 
    } 
    if (Head->Next == NULL) {    
    cout<<" \n This is 1-node list & item not in it\n"; 
    return; 
    }     
    node* current = Head; 
    node* del = Head; 

    while(del->Next != NULL && del->item != itm) { 
    del = del->Next; 
    } 

    // reached with del->Next == NULL || del->item == itm 
    current = del->previous; 
    if (del->Next == NULL) { 
    // at end of list 
    if (del->item != item) { 
     // item not found 
     // todo: signal error 
     return; 
    } 
    current->Next = NULL; 
    } else { 
    del->Next->previous = current; 
    current->Next = del->Next; 
    } 
    delete(del); 
    flag = 1; 
} 

Примечания: Я исправил много ошибок, и пытался держать его в пределах вашей логики. Я бы написал это по-другому.

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