c中的通用链表c ++实现

时间:2016-07-05 17:04:05

标签: c++ generics linked-list

我试图在C ++中实现通用的链接对象列表。但是当我两次获取同一个对象时,它会给我不同的结果。我觉得这是因为误用了指针。请帮我调试。

这是Node实现。我使用了指针模板,因为链表应包含用户定义的对象。

 template <class T> class Node{
 private:
 T* value;
 Node<T>* next;        
 public:
 Node(T* v){value = v; next = NULL;}
 Node(T* v, Node<T>* n){value = v; next = n;}
 T* getElement(){return value;}
 Node<T>* getNext(){return next;}
 }; 

以下是通用链表的实现。

 template <class T> class LinkedList{
 public:
 Node<T>* head = NULL;
 LinkedList(){}    
 LinkedList(T* value){
    Node<T> node(value);
    head = &node;
}
Node<T>* getHead(){
    return head;
}
void add(T* value){
    Node<T> node(value,head);
    head = &node;
}  
};

主要功能: 当我打电话给链表的头部时,它给了我2个不同的答案。在这段代码中,Complex是一个容纳复杂对象的简单类。

  int main(){
  Complex c1(1,2); Complex c2(3,4); Complex c3(5,6);
  LinkedList<Complex> list(&c1);
  list.add(&c2);
  cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl;
  cout<<list.head->getElement()->i<<" "<<list.getHead()->getElement()->j<<endl;
  return 0;
  }

提前致谢!!

1 个答案:

答案 0 :(得分:2)

LinkedList(T* value)void add(T* value)中,您使用head = &node;获取临时地址。一旦你超出了该函数的范围,head就成了悬空指针。

您需要在堆上创建一个新节点,以使其生命周期超出该函数的范围。

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

不要忘记delete在析构函数中创建的所有节点以避免内存泄漏,甚至更好,切换到智能指针而不是原始指针,以便为您完成清理。 / p>