2016-12-06 9 views
0

Ich habe C++ für eine Weile gelernt, und gerade erst begonnen, verknüpfte Listen zu suchen. Ich kann eine Template-Klasse List mit den üblichen Funktionen einfügen/entfernen von hinten/vorne erstellen. Jetzt kam ich mit einer Übung, die mich auffordert, eine Funktion zu schreiben, um Einfügungen/Löschungen irgendwo in der Liste zu handhaben.Einfügen/Löschen irgendwo in einer verknüpften Liste in C++

Bitte beachten Sie, dass meine Fragen sind sehr einfach.

Das Problem, das ich habe ist, dass ich die Frage nicht eindeutig zu sehen. Welche Art von Informationen benötigt die Funktion? Zum Beispiel für das Löschen, I mit mehreren Kandidaten kommen kann: 1), um den ersten Knoten löschen, die einen bestimmten Wert (Argument hat: value) 2) Löschen alle Knoten mit einem bestimmten Wert (Argument: value) 3) löschen ein bestimmter Knoten (Argument: Zeiger auf diesen Knoten) 1) und 2) kann ich leicht codieren. 3) ist schwieriger, aber ich kann es auch tun. Ich sehe den Punkt in 3) einfach nicht. Ist es üblich, Knoten (außerhalb der Listendefinition) zu manipulieren, wenn man Listen verwendet? Wie in, ist es üblich für ein Programm, das Listen benutzt, um Zeiger auf die Knoten zu manipulieren?

Was ist die übliche Bedeutung von „löschen überall“ in dieser Einstellung?

Auch für „insert überall“ ist der Wortlaut seltsam. Was bedeutet "überall"? Soll der Platz in der verknüpften Liste von einem bestimmten Knoten vergeben werden?

+0

Nicht wirklich klar, was Sie fragen. Sie möchten, dass wir raten, was mit einer Übung gemeint ist, die Sie irgendwo gelesen haben? Sie können sich die Standardcontainer ansehen, um zu sehen, wie ihre Schnittstelle hergestellt wird. Sie verwenden normalerweise Iteratoren – user463035818

+0

Die Funktion erfordert eine Art von Ortsmarkierung. Es kann ein int oder besser noch ein Objekt sein, das eine Position kapselt, so dass Sie nicht über die gesamte Liste iterieren müssen (wie die Art, wie std :: list seinen Iterator verwendet). – StoryTeller

+1

Wenn dies nur eine Übung ist, möchten Sie vielleicht alle genannten Wege und noch mehr, wenn Sie durch andere interessante Ideen kommen. Sie könnten auch verschiedene Arten des Reagierens auf Fehler beim Löschen üben (wie kein Element gefunden -> bool oder enum zurückgeben, Fehler werfen usw.). "Anywhere" könnte in diesem Kontext alles bedeuten, was Sie wollen, solange es Sinn macht. Ich würde Option hinzufügen, um Knoten am angegebenen Index auch zu löschen. –

Antwort

1

In verknüpften Liste haben Sie konstante Zeit Zugriff auf das erste Element. Also delete/insert irgendwo bedeutet die Stelle, die zwischen dem ersten und letzten Element existiert. Grundsätzlich benötigen Sie 2 Iteratoren. Wenn Sie die Stelle finden, die Sie entfernen/einfügen möchten, sollten Sie sich auf das Objekt direkt davor beziehen. weil Sie nicht auf das vorherige Element Zugriff haben, nur auf den nächsten:
E0-> E1-> E2-> E3-> E4

Wenn Sie wollen: unsere verknüpften Liste das sieht aus wie sie an, entferne E3, du musst Iterator auf E2 setzen, damit du Zeiger für E2-> next korrigieren kannst.

gute Referenz ist das Buch Standard Library von Nicolai M. Josuttis schrieb. Das Problem, auf das Sie gestoßen sind, wird dort ausführlich beschrieben.

0
node*insert(node*head,int d){ 

    node*temp=new node; 
    temp->data=d; 
    if(head==NULL){ 
     temp->next=NULL; 
     head=temp;} 
    else 
     {node*curr=head,*pre=NULL; 
    while (curr!=NULL && curr->data<temp->data) 
    { 
     pre=curr; 
     curr=curr->next; 
    } 
    temp->next=curr; 
    if(pre==NULL) 
     head=temp; 
    pre->next=temp; 
    } 
    return head; 
} 
+0

Willkommen bei Stack Overflow!Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. – jmattheis

Verwandte Themen