2016-11-29 11 views
-1

Ich lerne alte Prüfungen für eine Prüfung. Eine Aufgabe besteht darin, eine Einfüge- und Druckfunktion zu implementieren, die Elemente am Anfang einer kreisförmigen Liste einfügt. Ein Programm wird bereitgestellt, um die Schülerlösung zu testen.Circular verkettete Liste in C++ (einfügen am Anfang)

für den Einsatz Meine Lösung ist:

void Circular_List::insert(std::string const& str) 
{ 
    if (entry == nullptr) { 
     entry = new Element(str); 
     entry -> next = entry; 
    } 
    else { 
     Element* temp = entry; 
     entry = new Element(str); 
     entry -> next = temp; 
    } 
} 

Mein Denkprozess: enter image description here

Es scheint, weil mein Druck zu arbeiten:

void Circular_List::print() const 
{ 
    Element* temp = entry; 
    while (temp -> next != temp) { 
     cout << temp -> name << endl; 
     temp = temp -> next; 
    } 
} 

druckt die Liste in der richtigen Reihenfolge AUSSER für das Element, das ich zuerst hinzugefügt habe. Ich verstehe nicht, warum das erste Element nicht gedruckt wird. Das mitgelieferte Programm gibt 20 Iterationen aus. Wenn ich zum Beispiel a, b, c, d, e einfüge, wird das Programm

d-> c-> b-> a-> a-> a-> a-> a-> a- a->> a-> a-> a-> a-> a-> a-> a-> a-> a-> a->

Dies scheint sehr aus, sollte es nicht Schleife die Vorderseite der Liste, anstatt nur einen zu drucken?

Das Testprogramm:

int j = 0; 
    for (Circular_List::Iterator i = l.begin(); i != l.end() && j < 20; ++i, ++j) 
    { 
    cout << *i << "->"; 
    } 
    cout << endl; 

class Iterator 
    { 
    public: 
    Iterator(Element* e) : pos(e) {} 
    ~Iterator() = default; 
    Iterator(Iterator const&) = default; 
    Iterator& operator=(Iterator const&) = default; 
    bool operator!=(Iterator const& i) { return pos != i.pos; } 
    operator bool() { return pos != nullptr; } 
    Iterator& operator++() { pos = pos->next; return *this;} 
    std::string operator*() { return pos->name; } 
    private: 
    Element* pos; 
    }; 

Ich nehme mein Einsatz ist falsch, aber ich kann nicht herausfinden, was ich falsch mache?

+2

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+1

Sie setzen 'entry-> next' auf' tmp', aber was ist 'tmp'' 'next'? – CompuChip

+0

Sie sollten viel weniger Testdaten verwenden. Beginne mit 3 oder 4 Elementen, nicht mit 20. Wenn es nicht mit 3 Elementen funktioniert, musst du die Dinge nicht komplizieren, indem du 20 probierst - repariere es einfach für 3 als erstes. – PaulMcKenzie

Antwort

2

Wenn Sie das zweite Element in die Liste einfügen, behält Ihr erstes Element den nächsten Eintrag bei, der auf sich selbst verweist. Sie müssen zwei weitere Felder aktualisieren: eines im eingefügten Datensatz und ein weiteres in der Liste, um auf den eingefügten Datensatz zu verweisen. Du versäumst es, Letzteres zu tun. Die else-Klausel sollte wahrscheinlich:

Element* temp = new Element(str); 
    temp->next = entry->next; 
    entry->next = temp; 
    entry = temp; 

Dies macht Eintrag einen Zeiger auf letzten Zyklus Element und entry-> next - der erste Zyklus Element;

Übrigens ist Ihre zweite Zeichnung falsch, da 'a' -> next auf 'a' und nicht auf entry zeigen sollte.

Verwandte Themen