2016-04-23 6 views
0

Ich habe Probleme beim Implementieren eines Kopierkonstruktors für eine doppelt verknüpfte Liste. Würde ich den Tail und die vorherigen Zeiger in der for-Schleife unterhalb setzen? Für eine einfach verkettete Liste gilt Folgendes:doubleLinkedList Kopiere Konstruktor

sortedList::sortedList(const sortedList& original) 
: size(original.size) 
{ 
if (original.head == NULL) 
    head = NULL; // original list is empty 

else 
{ 
    // copy first node 
    head = new listNode; 
    tail = new listNode; 
    assert(head != NULL); // check allocation 
    assert(tail != NULL); // check allocation 
    head->item = original.head->item; 
    tail->item = original.tail->item; 
    // copy rest of list 
    listNode *newPtr = head; // new list pointer 


    // newPtr points to last node in new list 
    // origPtr points to nodes in original list 
    for (listNode *origPtr = original.head->next; origPtr != NULL; origPtr = origPtr->next) 
    { 
     newPtr->next = new listNode; 
     assert(newPtr->next != NULL); 

     newPtr = newPtr->next; 

     newPtr->item = origPtr->item; 
     /* 
     newPtr = new listNode; 
     newPtr->item = origPtr->item; 
     newPtr->prev = origPtr->prev; 
     tail->next = origPtr; 
     tail = origPtr;*/ 
    } 

    newPtr->next = NULL; 
} 

} 
+0

hinzugefügt Antwort. versuche zu sehen, ob es funktioniert. – trans1st0r

Antwort

0

Sie müssen die prev-Zeiger für jedes kopierte Element innerhalb der Schleife setzen. Danach aktualisieren Sie head->prev und tail->next.

helfen Dies könnte:

for (listNode *origPtr = original.head->next; origPtr != original.head; origPtr = origPtr->next) 
    { 
     newPtr->next = new listNode; 
     assert(newPtr->next != NULL); 

     listNode * prev = newPtr; 
     newPtr = newPtr->next; 

     newPtr->item = origPtr->item; 
     newPtr->prev = prev; 
    } 

    tail->next = head; 
    head->prev = tail;