2016-12-23 6 views
0

단일 목록 복사 생성자 작업을 마쳤습니다. 이제 이중 복사 복사 생성자로 향하고 있습니다. 아무도 그것이 단일 목록 생성자에서 얼마나 다른지 말해 줄 수 있습니다. 이중 연결 목록 복사 생성자에 대해 새로 시작하거나 단일 목록 복사 생성자를 복사하는 사이에 충돌이 발생합니다. 이 문제를 어떻게 해결해야합니까? 도움이된다면이중 목록 복사 생성자 : 단일 목록 복사 생성자와 다른 점은 무엇입니까?

, 여기 내 단일 연결 목록에서 내 복사 생성자입니다 :

 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 * 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 인리스트를 복사 해보자. –

+0

코드를 분석 할 수 없었다. – user1438832

+0

@MartinBonner는 그렇지 않다. if –