复制链表类的构造函数

时间:2012-10-25 05:09:01

标签: c++

所以我想复制一个完整的链表类,我很难搞清楚如何这样做,

class list{
   public:
  list(const list &t);
private:
  struct Node{
    int x;
    Node *next;
  }*p;

我从这样的事情开始:

list::list(const list &t){
  Node* q;
  q=new Node;
  while (p!=NULL){
    q->x= p->x;}
}

但我不确定我是在正确的轨道上还是什么。我也有麻烦我应该如何测试这样的拷贝构造函数?例如,我有列表l1,然后我将几个整数插入列表,然后我如何复制它?

3 个答案:

答案 0 :(得分:2)

在您的示例中,如果您初始化p,它将永远不会工作,或者如果p != NULL将永远工作。遍历t list时必须分配新节点:

  p = NULL;
  Node* copy = l.p;
  Node* insert = p;
  Node* inserted_el = NULL;
  while (copy){
     insert = new Node(); 
     insert->x = copy->x; 
     insert->next = NULL;
     if (inserted_el) {
         inserted_el->next = insert; //copy memory pointer to next element
     } else {
         p = insert; //copy memory pointer to list head
     }
     copy = copy->next;
     inserted_el = insert;
  }

这是基本的想法。另外不要忘记实现assign运算符和析构函数。 用法:

list t1;
//insert nodes
list t2(t1);

答案 1 :(得分:1)

您的代码中最大的麻烦是您不需要复制列表中的每个节点。

以下是ctor的代码:

list::list(const list &t)
{
  p = NULL;            // Init the head of the list this is vital important.

  // Loop over the elements of the passed list if any.
  Node *pt = t.p;
  Node *last_local_element = NULL;
  while (pt != NULL)
  {
     // Allocate a new node and set the fields there.
     Node *q = new Node;
     q->x= pt->x;
     q->next = NULL;

     // Add new node to the local list.
     if (last_local_element != NULL) {
         last_local_element->next = q;
     } else {
         p = q;
     }

     last_local_element = q;

     // Shift the loop variable along the passed list.
     pt = pt->next;
  }
}

最常见的情况是调用复制程序时的情况:

list my_list1;

list my_list2(my_listl);           // Explicit call.
list my_list3 = my_listl;          // Assignment in the definition statement.

答案 2 :(得分:1)

根据您的类设计,您需要小心内存管理。这是代码:

list::list(const list& t) {
  Node* n = t.p;
  Node* m = p;
  while (n) {
    if (!m) {
      m = new Node(); // Allocate memory.
      if (!p) p = m;
    }
    m->x = n->x;
    m = m->next;
    n = n->next;
  }

  if (m) { // Original list is longer, delete the rest of the list.
    Node * tmp = m;
    m = m->next;
    delete tmp;
  }
}