Грешка при изтриването на няколко елемента. Метод за изтриване. Единичен свързан списък

Направих (с малко помощ) единичен свързан списък с C++, който сортира въведените елементи от най-малко към най-голямо. Искам да изтрия няколко елемента от една и съща стойност, но методът Delete, който използвам, изглежда може да изтрие само един, когато изглежда, че кодът изтрива повече. Опитвам се да използвам цикъл, извикващ метода Delete, за да изтрия няколко елемента, и когато изтрие един, това се превръща в грешка в сегментирането. Ще се радвам на малко помощ. Благодаря ти.

void List::Append(float time, char type, int cell, long id) {

// Create a new node
Node* newNode = new Node();
newNode->SetTime(time);
newNode->SetType(type);
newNode->SetCell(cell);
newNode->SetId(id);
newNode->SetNext(NULL);

// Create a temp pointer
Node *tmp = head;

if ( tmp ) {
    if ( tmp->Time() < newNode->Time() ) {
        newNode->SetNext(tmp);
        head = newNode;
    }
    else {
        // Nodes already present in the list
        // Parse to end of list anytime the next data has lower value
        while ( tmp->Next() && tmp->Next()->Time() >= newNode->Time() ) {
            tmp = tmp->Next();
        }

        // Point the lower value node to the new node
        Node* _next = tmp->Next();
        tmp->SetNext(newNode);
        newNode->SetNext(_next);
    }
}
else {
    // First node in the list
    head = newNode;
}

}

void List::Delete(long id) {

// Create a temp pointer
Node *tmp = head;

// No nodes
if ( tmp == NULL )
    return;

// Last node of the list
if ( tmp->Next() == NULL ) {
    delete tmp;
    head = NULL;
}
else {
    // Parse thru the nodes
    Node *prev;
    do {
        if ( tmp->Id() == id ) break;
        prev = tmp;
        tmp = tmp->Next();
    } while ( tmp != NULL );

    // Adjust the pointers
    prev->SetNext(tmp->Next());

    // Delete the current node
    delete tmp;
}

}


person forkfork    schedule 08.10.2012    source източник
comment
@WhozCraig Възнамерявах да изтрия елемент, когато съответства на идентификатора, който търся, и след това го включих в цикъл, докато изтрие всички същите идентификатори.   -  person forkfork    schedule 08.10.2012


Отговори (1)


в списък :: Изтриване на код:

 if ( tmp->Id() == id ) break;<--------

ако прекъснете, цикълът do{}while приключва. което води до само 1 изтриване.

person Community    schedule 27.12.2012