Doppelte verkettete Liste in C++



  • Hallo,

    ich habe folgendes Problem. Wir sollen eine Klasse für die Knoten einer doppelt verketteten Liste erstellen, die nicht gegeben ist. Welche Funktionien diese Klasse haben soll könnt ihr dem von mir erstellten Skelett entnehmen. Leider habe ich überhaupt keine Ahnung von verketteten Listen bzw. deren Knoten und auch im Internet habe ich leider nichts ausreichend verständliches gefunden, daher weiß ich nicht einmal wie ich Anfangen soll...

    Die Lösung müsste eigentlich recht simpel sein. Nur komm ich irgendwie überhaupt nicht drauf. Ich hoffe ihr könnt mir da weiter helfen.

    Vielen Dank schon Mal an Alle.

    #include "EntryNode.h"
    #include <iostream>
    
    using namespace std;
    
     void setNextEntry(EntryNode *nextEntry){ // Den nächsten Entry setzen
    
     }
     void setPrevEntry(EntryNode *prevEntry){ // Den vorherigen Entry setzen
    
     }
     void setDate(unsigned int newDate){ // Datum für den Entry setzen
    	date = newDate;
     }
     void setAmount(float newAmount){ // Betrag für den Entry setzen
    	amount = newAmount;
     }
     EntryNode *getNextEntry(){
    
     }
     EntryNode *getPrevEntry(){
    
     }
     float getAmount(){ // Soll den Betrag vom Entry zurückliefern
    	return amount;
     }
     unsigned int getDate(){ // Soll das Datum vom Entry zurückliefern
    	return date;
     }
    


  • Wie kann es sein, dass man euch eine Aufgabe zu einem nie behandeltem Thema gibt?
    Und was genau verstehst du am betreffenden Wikipedia-Artikel nicht?

    In einer doppelt verketteten Liste zeigt jeder Knoten auf den vorherigen und nächsten Knoten.
    Ein Knoten ist dazu da, einen Wert (das Datum) zu speichern.
    Eine Liste ist eine Sammlung von >=0 Knoten.

    ...wie dem auch sei: um diese Aufgabe zu lösen, muss man nicht die geringste Ahnung über verkettete Listen haben.



  • Athar schrieb:

    Wie kann es sein, dass man euch eine Aufgabe zu einem nie behandeltem Thema gibt?
    Und was genau verstehst du am betreffenden Wikipedia-Artikel nicht?

    In einer doppelt verketteten Liste zeigt jeder Knoten auf den vorherigen und nächsten Knoten.
    Ein Knoten ist dazu da, einen Wert (das Datum) zu speichern.
    Eine Liste ist eine Sammlung von >=0 Knoten.

    ...wie dem auch sei: um diese Aufgabe zu lösen, muss man nicht die geringste Ahnung über verkettete Listen haben.

    Den Wikipedia Artikel hab ich bereits einige Male gelesen und dazu noch eine Menge mehr im Internet, aber wirklich verständlich war mir das nicht. Also nicht das ich es inhaltlich nicht verstanden hätte, dass war nicht das Problem, jedoch wie ich das ganze auf meine Aufgabe anwende das ist mir unverständlich.

    Nehmen wir Mal die beiden Funktionen setNextEntry und setPrevEntry. Übergeben bekomme ich hier etwas vom Typ EntryNode (dieses muss wiederrum ein Datum und einen Betrag enthalten), dass ganze soll ich jetzt in den nächsten bzw. vorherigen Entry speichern. Nur wie komme ich zu dem? Und das ohne Wissen über Listen? Vllt. bin ich ja auch einfach nur zu blöd dafür, aber ich verstehe es ehrlich gesagt nicht.

    Bei einem Array ist sowas ja sehr einfach indem man einfach array[i+1] macht um zum nächten Inhalt zu kommen, aber wie funktioniert das bei Listen und in diesem speziellen Fall, wie ist es, wenn auch noch 2 Sachen in der Liste gespeichert werden sollen.



  • Schau mal in EntryNode.h, daraus müsste ja ersichtlich sein, wie die Klassenstruktur aussieht.

    Jeder Knoten wird mit Sicherheit ein prev- und next-Member haben.
    In setNextEntry musst du beispielweise nur next=nextEntry; schreiben.
    Natürlich macht das nur Sinn, wenn die Funktionsskelette zu EntryNode gehören.



  • Athar schrieb:

    Schau mal in EntryNode.h, daraus müsste ja ersichtlich sein, wie die Klassenstruktur aussieht.

    Jeder Knoten wird mit Sicherheit ein prev- und next-Member haben.
    In setNextEntry musst du beispielweise nur next=nextEntry; schreiben.
    Natürlich macht das nur Sinn, wenn die Funktionsskelette zu EntryNode gehören.

    So hab ich es auch sämtlichen Anleitungen im Internet entnommen. Nur muss ich doch irgendwo definieren, wie er zum prev- bzw. next-Member kommt. Da ist bei mir das Verständnisproblem glaub ich. Wie ich auf den Knoten bzw. den prev- next-Knoten zugreifen kann. Doch nicht einfach mit next!!! Das wäre dann doch einfach eine undefinierte Variable...

    Also die EntryNode.h muss ich natürlich auch selber dazu schreiben. Diese sieht bisher nur so aus.

    class EntryList
    {
    private:
    
    public:
    void deleteEntryNode(EntryNode *entryToDelete);
    void insertEntryNode(float amount, unsigned int date); 
    void deleteEntryList(); 
    EntryNode *getFront(EntryList *list);
    EntryNode *getBack(EntryList *list);   
    void setFront(EntryNode *node);
    void setBack(EntryNode *node);  
    }
    


  • Also ich habs jetzt so gemacht...

    EntryNode.cpp

    #include "EntryNode.h"
    #include <iostream>
    
    using namespace std;
    
    EntryNode::EntryNode(){
    	prev = NULL;
    	next = NULL;
     }
     void EntryNode::setNextEntry(EntryNode *nextEntry){ // Den nächsten Entry setzen
    	next = nextEntry;
     }
     void EntryNode::setPrevEntry(EntryNode *prevEntry){ // Den vorherigen Entry setzen
    	prev = prevEntry;
     }
     void EntryNode::setDate(unsigned int newDate){ // Datum für den Entry setzen
    	date = newDate;
     }
     void EntryNode::setAmount(float newAmount){ // Betrag für den Entry setzen
    	amount = newAmount;
     }
     EntryNode *getNextEntry(){
    	return next;
     }
     EntryNode *getPrevEntry(){
    	return prev;
     }
     float EntryNode::getAmount(){ // Soll den Betrag vom Entry zurückliefern
    	return amount;
     }
     unsigned int EntryNode::getDate(){ // Soll das Datum vom Entry zurückliefern
    	return date;
     }
    

    EntryNode.h

    class EntryNode
    {
    private:
    	EntryNode *prev;
        EntryNode *next;
        int amount;
        int date;
    
    public:
    	void setNextEntry(EntryNode *nextEntry);
    	void setPrevEntry(EntryNode *prevEntry);
    	void setDate(unsigned int newDate);
    	void setAmount(float newAmount);
    	EntryNode *getNextEntry();
    	EntryNode *getPrevEntry();
    	float getAmount();
    	unsigned int getDate();
    }
    

Log in to reply