0

入力された要素を最小のものから最大のものへとソートする C++ を使用して、(少し助けを借りて) 単一の連結リストを作成しました。同じ値からいくつかの要素を削除したいのですが、使用する Delete メソッドは、コードがさらに削除するように見えるときに、1 つしか削除できないようです。複数の要素を削除するために Delete メソッドを呼び出すループを使用しようとしましたが、1 つを削除するとセグメンテーション違反になります。助けていただければ幸いです。ありがとうございました。

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;
}

}

4

1 に答える 1

0

リスト内::コードを削除:

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

ブレークすると、do while ループが終了します。{} その結果、1 つの削除のみが発生します。

于 2012-12-27T03:32:13.097 に答える