1

宿題の場合、番号が渡された同様のノードをすべて削除する必要があります。たとえば、私がリストにある場合

3 5 5 4

5 はリンクされたリストから削除され、I で終了します

3 4

このクラスに std ライブラリを使用することは許可されていません。ヘッダー ファイルは次のとおりです。

    namespace list_1
{
    class list
    {
    public:
        // CONSTRUCTOR
        list( );
        // postcondition: all nodes in the list are destroyed.
        ~list();
        // MODIFICATION MEMBER FUNCTIONS
        //postcondition: entry is added to the front of the list
        void insert_front(const int& entry);
        //postcondition: entry is added to the back of the list
        void add_back(const int& entry);
        // postcondition: all nodes with data == entry are removed from the list
        void remove_all(const int& entry);
        // postcondition: an iterator is created pointing to the head of the list
        Iterator begin(void);

        // CONSTANT MEMBER FUNCTIONS
        // postcondition: the size of the list is returned
        int size( ) const;
    private:
        Node* head;
    };

}

リストの前面と背面を削除する方法は理解できます。しかし、何らかの理由で、リストを調べて、渡されたすべての番号を削除することに頭を悩ませることはできません。何でも役に立ちます! ありがとう

Node.hを含めるように編集

#pragma once

namespace list_1
{
    struct Node
    {
        int data;
        Node *next;

        // Constructor
        // Postcondition: 
        Node (int d);
    };
}
4

1 に答える 1

2

これには 2 つの方法があります。1 つ目は、リストを反復処理してノードを削除することです。これを行うには、next値を変更できるように前のノードへのポインターを保持する必要があるため、注意が必要です。ノードを削除するコードは次のようになります (currentが現在のノードで、prevが前のノードであると仮定します)。

Node* next = current->next;
delete current;
prev->next = next;

ただし、前のノードへの参照を維持するのは少し面倒なので、別の方法を紹介します。dataこの方法では、基本的に新しいリストを作成しますが、が等しいノードを挿入しませんentry

コードは次のようになります

void list::remove_all(const int &entry)
{
    Node* newHead = NULL;
    Node* newTail = NULL;
    Node* current = head;

    // I'm assuming you end your list with NULL
    while(current != NULL)
    {
        // save the next node in case we have to change current->next
        Node* next = current->next;
        if (current->data == entry)
        {
            delete current;
        }
        else
        {
            // if there is no head, the set this node as the head
            if (newHead == NULL)
            {
                newHead = current;
                newTail = current;
                newTail->next = NULL; // this is why we saved next
            }
            else
            {
                // append current and update the tail
                newTail->next = current;
                newTail = current;
                newTail->next = NULL; // also why we saved next
            }
        }
        current = next; // move to the next node
    }
    head = newHead; // set head to the new head
}

注: 私はこれをテストしませんでした。頭のてっぺんから入力しただけです。動作することを確認してください。=)

お役に立てれば!;)

于 2013-09-11T00:03:10.437 に答える