2016-10-09 14 views
3

연결된 목록 클래스의 간단한 복사본 생성자를 쓰려고합니다. 내 수업은 간단합니다. 첫 번째 노드를 가리키는 변수 First와 마지막 노드를 가리키는 변수 Last가 있습니다.C++ 단순 연결 목록의 복사본 생성자 작성

이것은 하나의 링크이므로 각 노드는 다음 노드를 가리키며 이전에는 없습니다. 복사 생성자를 작성하려고하지만 마지막 노드가 여전히 동일한 주소를 가리키는 것으로 보이는 경우 (복사 된 목록에 무언가를 추가하는 경우) 원본 주소에도 나타납니다.

Heres는 내가 지금까지 무엇을 :

queue::queue(const queue &v){ 
    first = v.first; 
    last = v.last; 


    first-> value = v.first->value; 

    node *curr = first; 
    node *otherCur = v.first; 
    while(otherCur->next != NULL){ 
     cout << "------Next is: " << otherCur->next->value << endl; 
     curr ->next = otherCur->next; 
     curr->next->value = otherCur->next->value; 
     curr = curr->next; 
     otherCur = otherCur->next; 

    } 
    curr->next = NULL; 


} 
+2

두 번째 객체의 모든 노드는 첫 번째 객체의 동일한 노드를 가리 킵니다. 두 번째 목록의 노드에 메모리를 할당하고 첫 번째 목록의 노드에서 값을 복사해야합니다. –

+0

다시 말해, 가리키는 대상 데이터를 복사 할 때 포인터를 복사하는 것입니다 – qxz

답변

0

당신은 당신의 코드에서 어떤 node 할당을 수행하지 않았습니다. 사실 각 node은 하나만 queue에 속해야합니다. 따라서 v을 복사하여 nodev에있는 수만큼 할당해야합니다.

다음 코드에서 소멸자 queue은 생성 된 모든 노드를 삭제해야합니다.

queue::queue(const queue &v) : first(NULL), last(NULL) { 
    if (v.first) { 
     first = new node(*v.first); 
     first->next = NULL; 
     last = first; 
     // first-> value = v.first->value; // copy constructor should have done that 

     node *curr = first; 
     node *otherCur = v.first; 
     while(otherCur->next != NULL){ 
      cout << "------Next is: " << otherCur->next->value << endl; 
      curr->next = new node(*otherCur->next); 
      curr->next->next = NULL; 
      last = curr->next; 
      // curr->next->value = otherCur->next->value; 
      curr = curr->next; 
      otherCur = otherCur->next; 
     } 
     // curr->next = NULL; 
    } 
}