繁体   English   中英

C ++中的双链表

[英]Double Linked Lists in 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;

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

您的代码不符合您对node的定义 - 在您定义data成员的node ,但在您的代码中,您使用的是o

在任何情况下,您将不得不进行两次动态分配来添加每个节点 - 一个用于节点本身,另一个用于它将指向的数据对象。 分配该数据对象时,您也可以将new的返回值直接分配给节点中的指针。 然后,您需要将指针传递到您刚分配的数据对象的数据对象复制到节点中的指针指向的位置。

认为指针有效负载不方便。 但也许该列表用于现有对象之上创建链接,如:

struct A { int i; };
A as[10] = { 1,2,3,4,5,6,7,8,9,10 };

LinkedList primes_in_my_data;
insertFront( primes_in_my_data, &as[1] );
insertFront( primes_in_my_data, &as[2] );
insertFront( primes_in_my_data, &as[3] );
insertFront( primes_in_my_data, &as[5] );
insertFront( primes_in_my_data, &as[7] );

// now I have a linked list of primes, and caused no extra memory allocation
// (except for the list overhead)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM