0

insert_back を呼び出すことができる機能する関数を取得しようとしています。リストの最後に値を挿入します

これまでのところ、私はコードを持っていますが、困惑していると思います。

    template <class Object>
void List<Object>::insert_back( const Object& data ) {
    ListNode<Object>* newnode = new ListNode<Object>( data, head->getNext() );
        if (!head) {

            head = newnode;
            return;
        }
        while (head->getNext()) {
            continue;
        }
        head->setNext( newnode );
    }

これは何も返さず、insert_back を呼び出すとプログラムが停止します。

.H ファイル

#ifndef LIST_H
#define LIST_H
#include <iostream>
#include "ListNode.h"
#include "ListIterator.h"

namespace cs20 {

template <class Object>
class List {
    public:
    List();
    List( const List& rhs );
    ~List();

    bool isEmpty() const;
    bool isIncreasing() const;
    void makeEmpty();
    ListIterator<Object> zeroth() const;
    ListIterator<Object> first() const;
    void insert( const Object& data,
                 const ListIterator<Object> &iter );
    void insert( const Object& data );
    void insert_back( const Object& data );
    ListIterator<Object> findPrevious( const Object& data ) const;
    void remove( const Object& data );

    const List& operator =( const List& rhs );
    const List& operator <<( const List& rhs );
private:
    ListNode<Object> * head;

};

}
#endif
4

3 に答える 3

3

コードを次のように変更します。

ListNode<Object>* lastNode = head;
while (lastNode->getNext())
    lastNode = lastNode->getNext();
lastNode->setNext( newnode );
于 2013-10-22T00:53:37.977 に答える
1

これは疑わしいようです:

ListNode<Object>* newnode = new ListNode<Object>( data, head->getNext() );

head->getNext()新しいノードに渡されます。パラメータが新しいリストノードのネクストポインタを初期化すると仮定します。NULLリストの 2 番目の要素ではなく、確実に渡す必要があります。

もう 1 つの問題は、head内部で変更することですinsert_backhead変数はクラスのメンバーです。頭をリストの最後まで移動すると、リストが失われます。代わりに一時変数を使用して繰り返します。

于 2013-10-22T00:54:06.713 に答える
0

パフォーマンスをまったく気にしないのでない限り、クラスに を追加するListNode<Object> *tail;ことをお勧めしますList。リストの最後のノードを指すようにしてください。新しいノードを追加する必要がある場合は、そのノードが指すノードの直後に新しいノードを追加し、追加したばかりの新しいノードを指すように更新します。

于 2013-10-22T02:26:17.767 に答える