doppel verkettete Liste



  • Hi Leute!

    Ich hab hier Code geschrieben der mir eine doppelt verkettete Liste implementieren soll.

    #include<iostream>
    using namespace std;
    
    struct node
    {
    	node *previous;
    	int value;
    	node *next;
    };
    
    void initList(node *head, node *end)
    {
    	head = new node;
    	end = new node;
    
    	head->next=end;
    	end->next=end;
    }
    
    void insertAfter(node *head, node *end, int wert)
    {
    	node *insert_element;
    	insert_element = new node;		//insert_element anlegen
    
    	insert_element->next = head->next;	//von head auf insert_element verbinden
    	insert_element->value = wert;	//in value den Wert schreiben
    	end->next = insert_element;		//von insert_element auf end verbinden
    
    }
    
    int main()
    {
    	node *element1, *element2, *element3, *element4;
    	node *head, *end;
    
    	initList(head, end);
    	insertAfter(head, end, 5);
    
    return 0;
    }
    

    Die Funktion insertAfter soll mir zwischen head und end ein neues Element insert_element einfügen. Ich hab nur hier jetzt irgendwie den Überblick verloren, ob das so stimmt. Könnt ihr mir helfen?



  • So wird das nichts. Implementiere die Liste als einzige Klasse.



  • Geht das wirklich nicht ohne Klassen? Laut Vorlesung kann ich an dieser Stelle noch gar keine Klassen 😉



  • Was ich ja eigentlich wissen wollte, ist, ob diese Funktion von der Überlegung her zumindestens Ansatzweise richtig wäre. Ich hab sie noch ein bisschen erweitert (um die previous-Richtung; is ja doppelt verkettet):

    void insertAfter(node *head, node *end, int wert)
    {
    	node *insert_element;
    	insert_element = new node;		//insert_element anlegen
    
    	insert_element->value = wert;		//in value den Wert schreiben
    
    	//next-Richtung
    	insert_element->next = head->next;	//von head auf insert_element verbinden
    	head->next = insert_element;		//von insert_element auf end verbinden
    
    	//previous-Richtung
    	insert_element->previous = end->previous;
    	end->previous = insert_element;
    }
    

    Ich hab hier quasi ein head-Element und ein end-Element. Und genau zwischen diesen Elementen möchte ich ein neues Element das insert_element einhängen.



  • vip@r schrieb:

    Geht das wirklich nicht ohne Klassen? Laut Vorlesung kann ich an dieser Stelle noch gar keine Klassen 😉

    Eine struct ist eine Klasse. Einziger Unterschied zwischen struct und class:
    Default-Sichtbarkeit bei class = private
    Default-Sichtbarkeit bei struct = public

    Edit: Was EOutOfResources dir wohl sagen wollte ist, dass du keine freien Funktionen machen sollst, sondern Methoden.

    lg


  • Mod

    Gugelmoser schrieb:

    vip@r schrieb:

    Geht das wirklich nicht ohne Klassen? Laut Vorlesung kann ich an dieser Stelle noch gar keine Klassen 😉

    Eine struct ist eine Klasse. Einziger Unterschied zwischen struct und class:
    Default-Sichtbarkeit bei class = private
    Default-Sichtbarkeit bei struct = public

    Er lernt in seiner Vorlesung aber C mit cout. Da ist das ein Unterschied vom Konzept her.



  • vip@r schrieb:

    Geht das wirklich nicht ohne Klassen?

    Doch, aber das ist ätzend.

    vip@r schrieb:

    Laut Vorlesung kann ich an dieser Stelle noch gar keine Klassen 😉

    node auch ist eine Klasse.

    EDIT: Viel zu langsam...



  • SeppJ schrieb:

    Gugelmoser schrieb:

    vip@r schrieb:

    Geht das wirklich nicht ohne Klassen? Laut Vorlesung kann ich an dieser Stelle noch gar keine Klassen 😉

    Eine struct ist eine Klasse. Einziger Unterschied zwischen struct und class:
    Default-Sichtbarkeit bei class = private
    Default-Sichtbarkeit bei struct = public

    Er lernt in seiner Vorlesung aber C mit cout. Da ist das ein Unterschied vom Konzept her.

    Oh, das kenn ich von meinen Vorlesungen...



  • Wie siehts jetzt mit obiger (leider editierter) Funktion aus?

    Stimmt das so, oder nicht?


  • Mod

    vip@r schrieb:

    Wie siehts jetzt mit obiger (leider editierter) Funktion aus?

    Stimmt das so, oder nicht?

    Hast du das Problem vollständig verstanden? Bist du der Meinung, es sollte so richtig sein? Funktioniert es? Warnt der Compiler nicht? Zeigt ein Speicherprüfer(z.B. valgrind) keine Fehler? Wenn du alle diese Fragen mit einem klaren Ja beantworten kannst, dann wird es wohl richtig sein. Ansonsten nicht. Aber dann hast du immerhin Techniken kennengelernt, wie du deinen Code auf grundlegende Funktion prüfen kannst. Das ist wichtiges Wissen.



  • Gut. Der compiler warnt mich vor keinem Fehler wenn ich diesen Code ausführe. valgrind benutze ich nicht. Ich denke aber wenn der compiler nicht schreit, sollte das genug sein. TROTZDEM muss das Programm nicht richtig sein, auch wenn der compiler nicht schreit, oder? Und genau das, wird mir kein noch so gutes (Zusatz-)Programm sagen können, oder?

    #include<iostream>
    using namespace std;
    
    struct node
    {
    	node *previous;
    	int value;
    	node *next;
    };
    
    void initList(node *head, node *end)
    {
    	head->next = end;
    	end->next = end;
    
    	end->previous = head;
    	head->previous = head;
    }
    
    void insertAfter(node *head, node *end, int wert)
    {
    	node *insert_element;
    	insert_element = new node;		//insert_element anlegen
    
    	insert_element->value = wert;		//in value den Wert schreiben
    
    	//next-Richtung
    	insert_element->next = head->next;	//von head auf insert_element verbinden
    	head->next = insert_element;		//von insert_element auf end verbinden
    
    	//previous-Richtung
    	insert_element->previous = end->previous;
    	end->previous = insert_element;
    }
    
    int main()
    {
    	//node *element1, *element2, *element3, *element4;
    	node *head, *end;
    
    	head = new node;
    	end = new node;
    
    	initList(head, end);
    	insertAfter(head, end, 5);
    
    return 0;
    }
    

  • Mod

    vip@r schrieb:

    Und genau das, wird mir kein noch so gutes (Zusatz-)Programm sagen können, oder?

    Aber hast du denn wenigstens mal getestet, ob es funktioniert? Oder anders gefragt: Hast du irgendeinen begründeten Verdacht, dass irgendetwas nicht stimmen könnte, außer mangelndes Vertrauen in dein eigenes Können?


Anmelden zum Antworten