0

所以我想复制整个链表类,我很难弄清楚如何去做,

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,然后我将几个整数插入到一个列表中,然后我如何复制它?

4

3 回答 3

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;
  }

这是基本思想。也不要忘记实现分配运算符和析构函数。用法:

list t1;
//insert nodes
list t2(t1);
于 2012-10-25T05:19:14.250 回答
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;
  }
}

调用复制ctor的最常见情况有两种:

list my_list1;

list my_list2(my_listl);           // Explicit call.
list my_list3 = my_listl;          // Assignment in the definition statement.
于 2012-10-25T06:08:56.393 回答
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;
  }
}
于 2012-10-25T06:24:26.023 回答