2012-03-13 66 views
2

我正在C++中使用模板化通用链接列表,并且遇到push()方法的问题。我想我知道这个问题,但我找不出解决方案。这是我的推送方法。链接列表推式方法

template <class T> void DLL<T>::pushFront(T value) { 
    Node<T> node(value); 
    temp = node; 
    temp->setPrev(*head); 
    temp->setNext(*(head->getNext())); 
    head->setNext(*temp); 
    temp->getNext()->setPrev(*temp);                                  
    this->length++;                                      
} 

推一些整数到列表,在列表遍历并打印关闭,似乎是在内存中随机空间数字打印关闭值结果之后。我认为这是因为在推送函数返回后,节点变量被销毁。任何人都知道为什么这不起作用?所有的setNext/Prev()和getNext/Prev()函数在我的其他测试中都能正常工作。我难倒...

编辑*

变量头和温度的类型节点<的T全局> *

+0

第3行应该是temp =&node? – tmpearce 2012-03-13 03:25:14

回答

1

你应该使用指针的节点存储在列表中。

Node<T> node(value); 
temp = node; 

此代码后已经走出了范围,分配给“节点”的内存将被释放,破坏你的链接列表。使用指针来代替:

template <class T> void DLL<T>::pushFront(T value) { 
    Node<T> *node = new Node<T>(value); 
    node->setPrev(head); 
    node->setNext(head->getNext()); 
    head->setNext(node); 
    node->getNext()->setPrev(node); 
    this->length++; 
} 

如果你的类节点应该是这样的:

template<class T> class Node { 
public: 
    /* ... */ 
private: 
    Node<T> *next; 
    T data; 
}; 
+0

即使这样做仍然有相同的结果。有什么具体的方法,我需要保持“新节点(价值)”活着吗?它可以在方法中声明,对吗? – 2012-03-13 22:25:45

+0

是的,没关系。你的节点结构可能有问题,因为你只给了我们这个方法,所以很难说它是什么。 – mfontanini 2012-03-14 00:21:28

0

首先,head应该是一个全球性的 - 它应该是DLL一员的话,每个DLL(可怜的缩写,国际海事组织)有一个头(可能是尾巴)。

其次,getnext,setnext,getprevsetprev似乎100%毫无意义地浪费时间。通过使用它们而不是读取/分配变量,您无法通过封装或可读性获得任何信息。

第三,@fontanini已经指出的那样,当你push一个节点,实际上你需要分配一个节点,而不是尝试重新使用单个节点每次。第四,它看起来像你过于复杂的指针操作,可能至少部分是由于丑的/不可读的等等。一旦你有一个节点,拼接它到链接列表的前面只需要三个操作(加上递增的长度):

template <class T> 
void DLL<T>::pushFront(T value) { 
    node<T> *tmp = new node<T>(value); 
    tmp -> next = head; 
    tmp -> next -> prev = tmp; 
    head = tmp; 
    ++length; 
} 

当我已经做到了,我发现它有点简单,只是通过指针节点的构造函数,虽然。在这种情况下,它出现这样的事情:

template <class T> 
void DLL<T>::pushFont(T value) { 
    // These parameters are value, prev, and next, respectively.        
    node<T> *tmp = new node<T>(value, NULL, head); 
    tmp->next->prev = tmp; 
    head = tmp; 
    ++length; 
}