Was ist ein Anker bei einer verketteten Liste?



  • Hi leute,

    ich versteh jetzt ein bisschen die verkettete Liste,
    aber kann mir jemand erklären was ein Anker ist?

    Hab gelesen, dass der Anker ein Zeiger ist, der auf das erste Listenelement zeigt.

    Ist ein Anker nicht das gleiche wie ein Listenelementkopf?

    [cli]#include <iostream>
    using namespace std;
    
    struct Listenelement
    {
    	int zahl;
    	Listenelement *nachfolger;
    };
    
    Listenelement *Anker = 0;
    
    int main()
    {
    	int Inhalt;
    	do
    	{
    		cin >> Inhalt;
    		if(Inhalt != 0)
    		{
    			Listenelement *neuesListenelement = new Listenelement;
    			neuesListenelement->zahl = Inhalt;
    			neuesListenelement->nachfolger = Anker;
    			Anker = neuesListenelement;
    		}
    	} while(Inhalt != 0);
    
    	while(Anker)
    	{
    		cout << Anker->zahl << endl;
    		Anker = Anker->nachfolger;
    	}
    
    	cin.sync();
    	cin.get();
    }
    


  • das ist der zeiger auf das oberste element der liste.
    quasi dein anker an die liste, da du sie sonst verlieren würdest (memeory leak)



  • Skym0sh0 schrieb:

    das ist der zeiger auf das oberste element der liste.
    quasi dein anker an die liste, da du sie sonst verlieren würdest (memeory leak)

    Aber warum benutzt man den Anker in dem Programm-Beispiel so oft??

    Verstehe ich iwie nich 😞



  • DerDebugger schrieb:

    Aber warum benutzt man den Anker in dem Programm-Beispiel so oft??

    Weil dort erst Elemente von vorne an die Liste angehängt werden und dann wieder von vorne abgehängt werden. Der Anker ändert sich dabei jedesmal.

    Wo hast du eigentlich dieses furchtbare Beispiel her?



  • Bashar schrieb:

    DerDebugger schrieb:

    Aber warum benutzt man den Anker in dem Programm-Beispiel so oft??

    Weil dort erst Elemente von vorne an die Liste angehängt werden und dann wieder von vorne abgehängt werden. Der Anker ändert sich dabei jedesmal.

    Wo hast du eigentlich dieses furchtbare Beispiel her?

    Aus dem Buch "Einstieg in C++".

    Warum findest du das Beispiel furchtbar?



  • Finger weg von den Galileo C++ Büchern.. die sind für die Tonne...



  • DerDebugger schrieb:

    Warum findest du das Beispiel furchtbar?

    - globale Variablen -> Schrott
    - wenn man denn schon new benutzt, dann gehört ein delete dazu
    - inhomogene Namenskonvention
    - ...



  • - globale Variablen -> Schrott
    - wenn man denn schon new benutzt, dann gehört ein delete dazu
    - inhomogene Namenskonvention
    - ...[/quote]

    Da gehört delete dazu. Hab nur ich weggemacht, damit ich nicht nochmehr durcheinander komm.



  • DerDebugger schrieb:

    Da gehört delete dazu. Hab nur ich weggemacht, damit ich nicht nochmehr durcheinander komm.

    Super Idee. 👍
    😞



  • DerDebugger schrieb:

    Da gehört delete dazu. Hab nur ich weggemacht, damit ich nicht nochmehr durcheinander komm.

    Reifer Entwicklungsprozess 👍

    Warum findest du das Beispiel furchtbar?

    Der Code ist einfach nur Müll...



  • Sone schrieb:

    DerDebugger schrieb:

    Da gehört delete dazu. Hab nur ich weggemacht, damit ich nicht nochmehr durcheinander komm.

    Reifer Entwicklungsprozess 👍

    Warum findest du das Beispiel furchtbar?

    Der Code ist einfach nur Müll...

    Warum ist der Code einfach nur Müll.
    Das Programm macht, was es soll - nämlich so viele Zahlen speichern wie der Nutzer es will.



  • Ist etwas Platformabhängig (und zwar in der Weise, das diese komische cin-get-sync Kombination nicht immer das tut, was du erwartest , was aber auch auf den Compiler ankommt)

    Und die Schleife fände ich so schöner (das ist glaub ich Geschmackssache) :

    int Inhalt = 1;
        while (cin >> Inhalt && Inhalt != 0)
    	{
    		 Listenelement *neuesListenelement = new Listenelement;
                neuesListenelement->zahl = Inhalt;
                neuesListenelement->nachfolger = Anker;
                Anker = neuesListenelement; 
    
    	}
    

    Inhalt ist nicht initialisiert (im Original, ich hab das im Code von mir nachgebessert)

    FAUSTREGEL:
    ⚠ ⚠ ⚠ AUF JEDES NEW EIN DELETE ⚠ ⚠ ⚠

    (Ich weiß jetzt nicht wo das da hingehört, also ist es nicht drinnen)



  • Sone schrieb:

    DerDebugger schrieb:

    Da gehört delete dazu. Hab nur ich weggemacht, damit ich nicht nochmehr durcheinander komm.

    Reifer Entwicklungsprozess 👍

    Warum findest du das Beispiel furchtbar?

    Der Code ist einfach nur Müll...

    Warum ist der Code einfach nur Müll.
    Das Programm macht, was es soll - nämlich so viele Zahlen speichern wie der Nutzer es will.



  • Amüsiert mich immer köstlich, wenn unregistrierte das sagen.

    der code ist einfach nur müll

    Grob gesagt, stimmt auch, aber Jeder fängt man an.

    Finger weg von den Galileo C++ Büchern.. die sind für die Tonne...

    Eins der höchsten Gesetze in C++ 😉

    Wutz schrieb:

    DerDebugger schrieb:

    Warum findest du das Beispiel furchtbar?

    - globale Variablen -> Schrott
    - wenn man denn schon new benutzt, dann gehört ein delete dazu
    - inhomogene Namenskonvention
    - ...

    Es würde ihm mehr bringen, wenn du auch sagst warum.
    von globale Variablen ist abzuraten, da sie überall (halt global) sichtbar sind. Das hat zur Folge, dass sehr schnell diese Variablen geändert werden können. Es gibt nur ganz ganz seltene ausnahmen, wo das Sinn macht.
    new Allociiert Speicher, dieser muss wieder freigegeben werden, das passiert mit delete, deswegen gehört zu jedem new ein delete. (Zu jedem new[] gehört ein delete[]).
    Gewöhn dir an, die Namen durchgängig gleich zu benennen. Das hilft dir selber dich zu orientieren, zum Beispiel was Variablen, was Funktionen, was Klassen, was Typedefs, was Enums etc. sind. Außerdem macht es das für andere einfacher den Code später nachzuvollziehen.



  • (OT) aus gegebenem Anlass würde es mich mal interessieren, ob man Beiträge mleden kann. Muss ich nen Mod per PN anschreiben? Oder gibts da irgendwo nen Button, den ich bis jetzt übersehen habe?



  • daddy_felix schrieb:

    (OT) aus gegebenem Anlass würde es mich mal interessieren, ob man Beiträge mleden kann. Muss ich nen Mod per PN anschreiben? Oder gibts da irgendwo nen Button, den ich bis jetzt übersehen habe?

    Button gibts keinen, PN wäre ne Mail. Alternativ in der Forentechnik posten, was dir missfällt. Oder darauf vertrauen, dass die Mods das schon sehen werden 😉



  • Cyres schrieb:

    Amüsiert mich immer köstlich, wenn unregistrierte das sagen.

    der code ist einfach nur müll

    Grob gesagt, stimmt auch, aber Jeder fängt man an.

    Finger weg von den Galileo C++ Büchern.. die sind für die Tonne...

    Eins der höchsten Gesetze in C++ 😉

    Wutz schrieb:

    DerDebugger schrieb:

    Warum findest du das Beispiel furchtbar?

    - globale Variablen -> Schrott
    - wenn man denn schon new benutzt, dann gehört ein delete dazu
    - inhomogene Namenskonvention
    - ...

    Es würde ihm mehr bringen, wenn du auch sagst warum.
    von globale Variablen ist abzuraten, da sie überall (halt global) sichtbar sind. Das hat zur Folge, dass sehr schnell diese Variablen geändert werden können. Es gibt nur ganz ganz seltene ausnahmen, wo das Sinn macht.
    new Allociiert Speicher, dieser muss wieder freigegeben werden, das passiert mit delete, deswegen gehört zu jedem new ein delete. (Zu jedem new[] gehört ein delete[]).
    Gewöhn dir an, die Namen durchgängig gleich zu benennen. Das hilft dir selber dich zu orientieren, zum Beispiel was Variablen, was Funktionen, was Klassen, was Typedefs, was Enums etc. sind. Außerdem macht es das für andere einfacher den Code später nachzuvollziehen.

    Aber warum ist der Code denn Müll? (abgesehen davon, dass delete fehlt und globale Variablen verwerndet werden.

    Stimmt die "Übersicht" nicht?

    Oder ist der gesamte Aufbau schlecht?

    Wenn ja könnte mir bitte jemand sagen, was ich verbessen könnte?

    Sind die Galileo Bücher wirklich so schlecht?

    Welches würdet ihr mir empfehlen? 🙂

    Achja - was meinst du mit "variablen immer gleich benennen" oder so?



  • DerDebugger schrieb:

    Aber warum ist der Code denn Müll? (abgesehen davon, dass delete fehlt und globale Variablen verwerndet werden.

    Das steht eigentlich da 😉

    DerDebugger schrieb:

    Stimmt die "Übersicht" nicht?
    Oder ist der gesamte Aufbau schlecht?

    Das gehört eigentlich gekapselt in eine Klasse, das kann man später aber immernoch auslagern

    DerDebugger schrieb:

    Sind die Galileo Bücher wirklich so schlecht?

    Ja! - Jedenfalls die C++-Bücher. "Java ist auch eine Insel" ist zum Beispiel super 😉

    DerDebugger schrieb:

    Welches würdet ihr mir empfehlen? 🙂

    Meine Favoriten sind "Der C++ Programmierer" (Deutsch) und der "C++ Primer" (Englisch), von welchem am 10.8. (also übermorgen) übrigens eine neue Ausgabe erscheint. Allerdings sind beide Bücher keine leichte Materie, aber wenn der Wille und die Motivation da ist, ist das kein Problem 😉

    DerDebugger schrieb:

    Achja - was meinst du mit "variablen immer gleich benennen" oder so?

    Du musst dich auf eine Konvention einigen. Mische nicht Variablennamen wie

    einBaum*
    Einbaum
    Ein_Baum
    einbaum
    ein_baum*
    ...
    

    Dazu gehört übrigens auch Einsprachig zu programmieren.
    Die mit *-versehenden Variablen sind die wohl am häufigsten benutzen Versionen.



  • Cyres schrieb:

    der code ist einfach nur müll

    Grob gesagt, stimmt auch, aber Jeder fängt man an.

    Fail!?

    Cyres schrieb:

    ...

    Eins der höchsten Gesetze in C++

    ...

    Es würde ihm mehr bringen, wenn du auch sagst warum.

    Fail!?



  • Sone, ist die Woche nicht langsam mal um, sodass du wieder Sinnvolle Beiträge posten kannst? Du tust hier nichts zur Sache!


Anmelden zum Antworten