2016-12-23 7 views
0

Я только что закончил работу над конструктором экземпляров одиночного списка, и теперь я решил создать конструктор копии с двойным списком. Может ли кто-нибудь сказать мне, насколько это отличается от конструктора одиночного списка, потому что я столкнулся с запуском заново для моего конструктора с двойным связыванием списков или для копирования моего конструктора копии одиночного списка. Как мне это сделать?Doubly List Copy Constructor: Как отличается он от единственного экземпляра Copy Constructor?

Если это помогает, вот мой конструктор копирования из моего односвязного списка:

 List(const List &copying) : head(NULL) 
     { 
      Node* cur = copying.head; 
      int size = copying.size(); 
      Node* end = NULL; 
      for(int q = 0; q < size; q++) 
      { 
       Node* n = new Node; 
       n->value = cur->value; 
       if (head == NULL) 
       { 
        head = n; 
        end = head; 
       } 
       else 
       { 
        end->next = n; 
        end = n; 
       } 
       cur = cur->next; 
      } 
      end->next = NULL; 
     } 

Любое вход приветствуется. Спасибо всем :-)

+0

Ваш конструктор копирования с односвязным списком взорвется, если вы копируете из пустого списка. Первое правило связанных списков: никогда не бывает особых случаев. 'Node ** target = &head; for (Node * cur = copying.head; cur; cur = cur-next) {Node * n = новый узел (cur-> value); * target = n; target = & (n-> next); } * target = nullptr; ' –

+0

Что именно« взорвет »означает @MartinBonner? Я на самом деле новичок в программировании на C++. –

+0

@PeterG Эта ссылка не касалась конструкторов копирования. Я проверил его, но он не ответил на мой запрос о конструкторах копий для дважды связанных списков. –

ответ

1

Думаю, вам просто нужно сохранить предыдущий узел (prv). Предполагая, что ваш узел имеет prv в качестве элемента данных.

List(const List &copying) : head(NULL) 
{ 
    Node* cur = copying.head; 
    int size = copying.size(); 
    Node* end = NULL; 
    Node* prv = NULL: 
    for(int q = 0; q < size; q++) 
    { 
     Node* n = new Node; 
     n->value = cur->value; 
     if (head == NULL) 
     { 
      head = n; 
      end = head; 
     } 
     else 
     { 
      end->next = n; 
      end = n; 
     } 
     n->prv=prv; 
     prv=n; 
     cur = cur->next; 
    } 
    end->next = NULL; 
} 
+0

Ну, вы воспроизвели ошибку - попробуйте скопировать нулевой список длин! –

+0

Извините, я не анализировал код. – user1438832

+0

@MartinBonner не то, что if '(head == NULL) {head = n; end = head;}' выполнит? –