2017-05-08 5 views
0

Ich hatte eine harte Zeit, meinen Kopf um Zeiger und verkettete Listen zu wickeln. Ich kann sehen, dass diese Art von Fragen hier sehr häufig gestellt werden, also entschuldige ich mich, dass ich sie in den Sumpf dieses Forums gebracht habe. Allerdings habe ich versucht, diese Aufgabe für zwei Tage zu übernehmen, und ich kann es einfach nicht verstehen.C++ Kopieren Konstruktor der Werte der verknüpften Liste, nicht Adressen

Ich sollte darauf hinweisen, dass dies eine Hausaufgabe ist!

Ich habe ein Projekt, bei dem ich eine verknüpfte Liste kopieren, die alte Liste zerstören und die Werte beibehalten muss. Ich muss fast die gesamte Liste als Referenz an den Kopierkonstruktor übergeben, nicht nur einen Knoten.

Coding a function to copy a linked-list in C++

Wenn ich versuche:

Ich habe einige wirklich gute Antworten schon hier gesehen, nachdem einige graben tun, und in der Nähe Ich habe eine Lösung zu dem, was ich erreichen müssen diese gesehen ist einen ähnlichen Code Mine zu implementieren, ist es mir diesen Fehler gibt beim Kompilieren: Fehler: ungültiges Typargument von einstelligen ‚*‘ (hat ‚int‘) verkettete Liste

Hier ist der Code:

IntList::IntList(const IntList &a){ 
    if(a.head != NULL) 
    { 
      ListNode *thisNode = a.head; 
      ListNode *nextN = NULL; 

      while(thisNode != NULL) 
      { 
        ListNode *newNode = new ListNode; 
        newNode->value = (*thisNode->value); //error occurs here 

        if(nextN == NULL) 
        { 
          nextN = newNode; 
        } 
        else 
        { 
          nextN->next = newNode; 
          nextN = nextN->next; 
        } 
        thisNode = thisNode->next; 
        size++; 
      } 
    } 
    else 
    { 
     cout << "The list empty." << endl; 
     return; 
    } 
} 

Wenn ich die Verkapselung in Zeile 10 entferne, gibt der Konstruktor keinen Fehler aus. Sobald ich jedoch den Destruktor anrufe, verweist die alte Liste immer noch auf den Speicher, der gerade geleert wurde.

Ich schätze wirklich jede Hilfe bei dieser Aufgabe. Ich denke, dass ich den Zeiger nicht richtig deneferenziere, aber ich kann nicht scheinen, um den Code zu brechen und es zum Funktionieren zu bringen ...

+0

Willkommen bei StackOverflow. Bitte nehmen Sie die [Tour], lernen, gute Fragen zu stellen stackoverflow.com/help/how-to-ask, machen eine [MCVE]. Wenn Sie Hilfe mit dem Debugging-Code suchen, siehe https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Yunnosch

+0

Sie sollten newNode-> value = thisNode-> Wert – Kapil

Antwort

0

Statt newNode-> value = (* thisNode-> value); müssen Sie newNode-> Wert = thisNode-> Wert;

+0

I verwenden Ich habe damit angefangen, aber wenn ich die vorherige Liste zerstöre, werden die Daten der neuen Liste nicht beibehalten. Ich denke NewNode-> Wert zeigt nur auf die gleiche Adresse wie ThisNode-> Wert. Ich bin mir nicht sicher, wie ich tatsächlich eine Kopie des Wertes erstellen und nicht nur auf das gleiche Stück Speicher zeigen soll. – RLee

Verwandte Themen