泛型链表c++实现

generic linkedlist c++ implementation in c

本文关键字:实现 c++ 链表 泛型      更新时间:2023-10-16

我试图在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;
}  
};

主要功能:当我调用链表头时,它会给我两个不同的答案。在这段代码中,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;
  }

提前感谢!!

LinkedList(T* value)void add(T* value)中,您正在使用head = &node;的临时地址。一旦超出了该函数的作用域,head就变成了一个悬垂指针。

您需要在堆上创建一个新节点,以便它的生命周期将扩展到该函数的范围之外。

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

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