链接列表实现添加方法[C ++]

时间:2013-07-09 03:19:00

标签: c++ class pointers linked-list

大家好我正在使用c ++中的类进行LinkedList实现,到目前为止,我只完成了节点类和添加方法。但它不起作用,例如我添加了一个新元素,当我检查第一个指针时,它指向我刚刚添加的最后一个元素......

节点类:

template<class T>
class Node
{
private:
    T element;
public:
    Node<T> *next;

    Node( T e ){
        element = e;
        next = NULL;
    }

    friend ostream& operator<<(ostream& os, const Node<T>& nd)
    {
        os << nd.element;
        return os;
    }   

};

LinkedList类:

 template<class T>
 class LinkedList{

    private:
        int size;

    public: 
        Node<T> *first;
        Node<T> *last;          

        LinkedList(){
            first = NULL;
            last = NULL;
            size = 0;
        }

        void add( T element ){
            Node<T> n (element);

            if( size == 0 ){
                first = &n;
            }else{
                last->next = &n;
            }
            last = &n;
            size++;     
        }

        int getSize(){
            return size;
        }


   };

所以例如我主要做的是:

LinkedList<int> list;

list.add(5);
list.add(7);


cout << *list.first;

它显示'7'作为第一个元素......

提前致谢。

1 个答案:

答案 0 :(得分:5)

你不能这样做。通过“this”,我的意思是存储指向本地范围的Node实例的指针,并期望该对象在其原始范围之外保持不变:

    void add( T element ){
        Node<T> n (element);     // This will only exist for the function's duration

        if( size == 0 ){
            first = &n;          // <-- naughty
        }else{
            last->next = &n;     // <-- naughty
        }
        last = &n;               // <-- naughty
        size++;     
    }

正如你所看到的,你一直非常顽皮。函数退出后,该节点将被删除。实际上,它只存在于堆栈中,所以它有点消失。幸运的是,当你再次调用该函数时,你恰好得到了相同的堆栈地址,所以看起来你的第一个节点已经改变了。

那你做什么?在堆上分配:

    void add( T element ){
        Node<T> *n = new Node<T>(element);

        if( size == 0 ){
            first = n;
        }else{
            last->next = n;
        }
        last = n;
        size++;     
    }

这不再顽皮,你可以继续制作其他指针相关的错误,这些错误是C或C ++程序员通过的基本仪式。 =)

确保在完成链接列表后,对其进行爬网并delete每个节点释放您分配的内存。