2014-11-14 3 views
0

링크 된 목록을 보완하기 위해 특정 메서드를 사용하여 링크 된 목록을 구현하려고합니다. 내가 링크 된 목록을 링크 된 목록을 복사, 첫 번째 연결리스트의 머리를 삭제하고 출력에 내 오버로드 된 연산자 "< <"을 구현하면 는 그러나, 나는링크 된 목록에 대한 복사 생성자의 올바른 구현

Unhandled exception at 0x0128506C in program.exe: 0xC0000005: Access violation reading location 0xFEEEFEF2. 

어떻게 당신이 복사 않는 오류를 얻을 첫 번째 연결된 목록에 의존하지 않고 연결된 목록.

NodeSLList list2 (list1); //copy constructor 
temp = list1.DeleteFromHead(); 
cout << "node retrieved " << temp.data << endl; 
cout << "cout << list1 " << endl; 
cout << list1 << endl; 
cout << list2 << endl; //error occurs 

이 코드는 그냥 같은 요소를 가리키는 목록을 작성한다으로 무슨 일을하는지

NodeSLList::NodeSLList(NodeSLList & list) 
{ 
    head = list.head; 
    tail = list.tail; 
    cout << "copy constructor called" << endl; 

} 
+4

연결된 목록 복사 생성자는 연결된 목록의 복사본을 생성해야합니다. 포인터 값의 복사본을 만드는 것은 그렇게하지 않습니다. 복사본에서 전체 링크 된 목록을 처음부터 다시 만들어야합니다. – PaulMcKenzie

답변

2

복사 생성자가 복사를 수행하지 않습니다. 원래 목록의 첫 번째 노드와 마지막 노드를 가리키는 새 목록 만 만듭니다.

기본적으로 원래 목록의 모든 노드를 순회하고 인접한 복사본을 함께 연결하는 복사본 생성자를 호출해야합니다.

Node* n=list.head; 
Node* prv=0; 
while (n) 
{ 
    Node* cpy = new Node(*n); 
    if (prv) 
     prv->next=cpy; 
    else 
     head=cpy; 

    n=n->next; 
    prv=cpy; 
} 
tail=prv; 
1

복사 생성자. 전체 목록을 탐색하고 모든 구성원에 대해 복사 생성자를 호출해야합니다. 목록을 다시 만들어야합니다.

요소를 '밀어 넣기', '추가'또는 '삽입'기능을 사용하여 요소를 목록에 푸시하는 경우 해당 함수를 사용하여 목록을 다시 만듭니다.