0

C++ でリンク リスト クラスを実装しようとしていますが、問題が発生しました。新しいノードを追加する += 演算子があります。

リンク リスト クラス インターフェイス:

template <typename Type>

class LinkedList {
public:
    LinkedList<Type>* head;
//  linked list stracture
    Type data;
    LinkedList<Type>* next;
//  others ....
    size_t length;
public:
    LinkedList();
    ~LinkedList();
    void initializeHead(LinkedList<Type>* headPtr);
    size_t size() const;
    LinkedList& operator+=(const Type& add);
    void operator-=(const Type& remove);
    LinkedList<Type>& operator[] (const size_t index) const;
    bool operator== (const LinkedList<Type> &versus) const;
    friend ostream& operator<< (ostream& out,LinkedList& obj);
};

そしてここで私は += オーバーロードを実装しています:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator +=(const Type& add) {
    // head ptr - :)
    LinkedList<Type>* p = head->next;
    // go to the end
    while(p) p = p->next;
    // now on end - create new..!!!
    try {
        p = new LinkedList<Type>;
    } catch (bad_alloc& e) {
        cout << "There\'s an allocation error....";
    } catch (...) {
        cout << "An unknown error.." << endl;
    }// fill and done
    p->data = add;
    p->next = NULL;
    // increment length .........
    ++head->length;
    // done ............
    return *p;
}

さらに、「配列」アクセスのオーバーロード メソッドがあります。

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator [](const size_t index) const {
    if(index < 0 || index >= length) // invaild argument
        throw  exception();
    // continue
    LinkedList<Type>* p = head;
    for(size_t i = 0; i < index; ++i) p = p->next; // we are at what we want
    return *p;
}

すべて正常に動作します - デバッガーで確認しました。

問題は - += が新しいノードを "head->next" に保存しないことです。何らかの理由で += メソッドを終了した後、head->next は null に等しくなります。

新しい割り当てが head->next にリンクしない理由を誰か知っていますか?

どうもありがとう!!

4

4 に答える 4

2

while(p) p = p->next;p が NULL の後

次はそうしますp = new LinkedList<Type>;が、p を頭にリンクしません。

于 2012-06-05T05:04:19.233 に答える
0

他の回答が言うように、追加しようとするとリストを超えてしまいます。次のようなことを試してください:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator +=(const Type& add)
{
    LinkedList<Type> *last;

    // Find the last node in the list
    for (last = head; last != 0 && last->next != 0; last = last->next)
    {
    }

    // `last` now points to the last node in the list, or is zero
    // If zero (i.e. NULL) then list is empty

    if (last == 0)
    {
        head = new LinkedList<Type>;
        head->next = 0;
        head->data = add;
        head->length = 0;
    }
    else
    {
        last->next = new LinkedList<Type>;
        last->next->next = 0;
        last->next->data = add;
    }

    // We can safely use `head` as we are sure it won't be zero
    head->length++;

    // Return the added node
    return (last != 0 ? *last->next : *head);
}
于 2012-06-05T05:35:04.327 に答える
0

それ以外の:

// go to the end
while(p) p = p->next;

必要なもの:

head->next = p;
于 2012-06-05T05:05:03.160 に答える
0

一時変数を使用して最後のノードを格納することもでき、最後のノードは新しいノードを指します。

これはサンプルコードです。最初のノードの追加など、いくつかの状況に注意する必要があります。

LinkedList<Type>* temp = NULL;
while(p) 
{
  temp = p;
  p = p->next;   
}  

try 
{             
  p = new LinkedList<Type>;         
  temp->next = p;
} 
于 2012-06-05T05:52:36.987 に答える