c++ - LinkedList实现添加方法[C++]

标签 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”作为第一个元素...

提前致谢。

最佳答案

你不能这样做。通过“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++ 程序员的基本通过仪式。 =)

确保当您完成链接列表时,您会爬过它并删除每个节点以释放您分配的内存。

关于c++ - LinkedList实现添加方法[C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17539329/

相关文章:

c++ - sal.h 不包括在 Path 中

oop - 什么时候不使用 setter 直接在对象上设置属性值被认为是好的设计?

java - 使用 Java 中的 Obj-C 类,有办法吗?

c - 指向结构体指针的指针

c++ - 给定起始地址和大小访问内存中的图像

c++ - 为什么 WinDbg 作为 C++ 应用程序崩溃的默认应用程序打开?

c++ - eigen C++ 中的 Cholesky 分解 : how to get both the D vector and the inverse in one swoop?

c++ - 使用 opencv 增长的种子区域

swift - 在 swift 结构上改变类属性

c - 如何从函数返回数组到main