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

copy ctor が呼び出されるケースとして最も多いのは次の 2 つです。

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 に答える