C++中的双链表

blc*_*llo 8 c++ pointers linked-list

我有一项任务要求我们实现双向链表类.出于某种原因,他们将节点定义struct如下:

struct node {
  node   *next;
  node   *prev;
  T      *o;
};
Run Code Online (Sandbox Code Playgroud)

在我看来,如果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;
}
Run Code Online (Sandbox Code Playgroud)

在使用ddd进行调试的时候,我意识到第一次插入数字时一切正常,但第二次绕过一切都搞砸了,因为一旦你将'val'设置为新元素,它就会"覆盖"第一个自记忆以来使用了val的地址.我尝试做其他事情,而不是只是让'val'变量执行以下操作:

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

np->o = valp
Run Code Online (Sandbox Code Playgroud)

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

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

Dre*_*ann 6

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

您应该使用new在堆上分配空间,如您所怀,但您的数据指针需要直接指向返回的地址new.

您最近尝试的错误在于:

valp = &val;
Run Code Online (Sandbox Code Playgroud)

您正在改变valp,以指向别处(val的地址),当你可能想复制VAL的数据,而不是它的地址.

传递给您的函数的数据应该复制到新的内存valp点.