插入链接列表的后面

时间:2013-10-22 00:48:43

标签: c++ linked-list

我正在尝试获取一个可以调用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

3 个答案:

答案 0 :(得分:3)

将您的代码更改为:

ListNode<Object>* lastNode = head;
while (lastNode->getNext())
    lastNode = lastNode->getNext();
lastNode->setNext( newnode );

答案 1 :(得分:1)

这看起来很可疑:

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

您正在将head->getNext()传递到新节点。我假设该参数初始化新列表节点中的下一个指针。你肯定应该通过NULL而不是列表的第二个元素。

另一个问题是您修改head内的insert_backhead变量是您班级的成员。如果您将头部一直移动到列表的末尾,您将丢失列表。使用临时变量代替迭代。

答案 2 :(得分:0)

除非您真的不关心 关于性能,否则您可能希望在ListNode<Object> *tail;课程中添加List。使其指向列表中的最后一个节点。当您需要添加新节点时,请在它指向的节点之后立即添加新节点,并将其更新为指向刚刚添加的新节点。