在C ++中的双链表

我有一项任务,要求我们实施一个双链表类。 出于某种原因,他们如下定义节点struct

struct node {
  node   *next;
  node   *prev;
  T      *o;
};

在我看来,如果struct成员的'data'不是一个指针,写这个类会容易得多。 不用说我不能改变它,所以我将不得不解决它。 我尝试实现将元素添加到列表开头的方法,如下所示:

template <typename T>
void Dlist<T>::insertFront(T *o) {
    node *np = new node;
    T val = *o;

    np->o = &val;
    np->prev = NULL;
    np->next = first;

    if (!isEmpty()) {
        first->prev = np;
    } else {
        last = np;
    }
    first = np;
}

在使用ddd进行调试时,我意识到一切正常,第一次插入一个数字时,第二次围绕一切就会被搞砸了,因为一旦你将'val'设置为新元素,它就会“覆盖”自存储器以来的第一个val的地址被使用。 我试着做其他事情,而不是仅仅让'val'变量做如下操作:

T *valp = new T;
T val;
valp = &val;
val = *o;

np->o = valp

这似乎也没有工作。 我认为这是因为它只是一个更复杂的形式,我做了上面的只是一个额外的内存泄漏:)

任何正确方向的想法/指针都会很棒。


你创建的T val是一个自动变量。 您的错误是将地址存储到该堆栈变量。

正如你怀疑的那样,你应该使用new来分配堆上的空间,但是你的数据指针需要直接指向由new返回的地址。

您最近一次尝试的错误在这里:

valp = &val;

当你想要复制val的数据 ,而不是地址时,你正在改变valp 指向别的地方val的地址)。

传递给你函数的数据应该被复制到valp指向的新内存中。


我不认为你应该这样做:

T val = *o;

由于节点结构中的o成员是一个指针,并且insertFront的参数也是一个指针,所以您的指导者可能打算让您获取指定的指针并将其存储在列表中,而不是创建对象的副本并存储一个指针。 只需将传入到insertFronto指针存储为节点的o成员,并且您应该没问题。


 T val = *o;

    np->o = &val;

这部分是可疑的。 提示是,一旦函数超出范围,函数中堆栈上分配的内存将不可用。

链接地址: http://www.djcxy.com/p/82473.html

上一篇: Double Linked Lists in C++

下一篇: C++ creating and collecting structs in a loop