Am ende der liste anhängen



  • Hallo Leute,
    ich habe folgendes Problem und zwar, dass mein Programm nicht so funktioniert wie ich mir das vorstelle. Ich habe eine Funktion geschrieben, welche ein listenelement am Ende der Liste anhängen soll. Das ganze sieht wie folgt aus.
    Die Verkettung wenn head == NULL ist um das erste Element hinzuzufügen funktioniert. Nach dem else klappt leider irgendwas mit der Verkettung nicht so ganz 😕 😕 😕

    struct element{
    
        int daten;
        struct element *nächstes;
        struct element *zurück;
    };
    typedef struct element *knoten;
    knoten *head=NULL;
    knoten *tail=NULL;
    
    void hinten_anhängen(int zahl)
    {
        struct element *neuer_knoten;
        if(NULL== (neuer_knoten = malloc(sizeof(struct element))))
        return;
    
        if(head == NULL)
        {
            head=neuer_knoten;
            neuer_knoten->nächstes=NULL;
            neuer_knoten->zurück=NULL;
            tail=neuer_knoten;
            neuer_knoten->daten=zahl;
        }
    
        else
        {
            //Der neue Knoten zeigt auf das ende
            neuer_knoten->nächstes=tail;     
    
            //Das ende wird der neue Knoten
            tail=neuer_knoten; 
    
            //der neue Knoten zeigt auf jenes davor, welcher nun auf den neuen knoten zeigt             
            neuer_knoten->zurück->nächstes=neuer_knoten;
    
            //bekommt den parameter zugewiesen
            neuer_knnoten->daten=zahl;
        }
    }
    

  • Mod

    Eine richtige Reihenfolge ist:

    // Altes Ende zeigt auf neues Ende
    tail->nächstes=neuer_knoten;
    
    // Neues ende zeigt zurück auf altes Ende
    neuer_knoten->zurück=tail;
    
    // Neues Ende zeigt auf nix:
    neuer_knoten->nächster=NULL;
    
    // Neues Ende aktualisieren:
    tail=neuer_knoten;
    

    Ungetestet.

    edit: Und die Daten habe ich vergessen zu setzen, aber das bekommst du sicher auch alleine hin.



  • ja das mit tail->nächstes, an das hatte ich auch schon gedacht aber da hängt sich leider mein compiler auf


  • Mod

    Dave01 schrieb:

    ja das mit tail->nächstes, an das hatte ich auch schon gedacht aber da hängt sich leider mein compiler auf

    Kannst du das erläutern? Bekommst du einen Compilerfehler oder einen Laufzeitfehler und in beiden Fällen: Welchen?



  • Dave01 schrieb:

    ja das mit tail->nächstes, an das hatte ich auch schon gedacht aber da hängt sich leider mein compiler auf

    Das ist aber eine äußerst unnachvollziehbare Fehlerbeschreibung. Poste mal ein komplettes Minimalbeispiel mit main.



  • Ok nun funktionierts!

    Den Teil mit :

    typedef struct element *knoten; 
    knoten *head=NULL; 
    knoten *tail=NULL;cpp]
    
    habe ich nun umgeändert:
    
    [cpp]typedef struct element *knoten;
    knoten *head=NULL;
    struct element *tail=NULL;
    

    Gibt es dafür eine Erklräung?

    Auch hätte ich mal gerne gewusst wie man denn eig. genau verkettet, ich mein, die Variante von mir ist eindeutig falsch. Aber die Verkettung ansich bleibt doch erhalten und kein element geht verloren?



  • Ich bin nicht so der C-Spezialist und habe es nun auch nicht ausprobiert, aber ich glaube, nach

    Dave01 schrieb:

    typedef struct element *knoten;
    

    steht 'knoten' bereits für 'Zeiger auf Struktur vom Typ element', so daß

    Dave01 schrieb:

    knoten *head=NULL; 
    knoten *tail=NULL;
    

    jeweils einen Zeiger auf einen Zeiger erstellt, richtig sollte meiner Meinung

    knoten head=NULL; 
    knoten tail=NULL;
    

    sein.
    Ich verstehe auch nicht den Unterschied zwischen struct element und struct node, wofür steht struct node? Ist der nicht überflüssig und sollten nicht die Zeiger in struct element auf andere (Vorgänger und Nachfolger) Daten vom Typ struct element zeigen?



  • Seit wann sind Umlaute in Bezeichnern erlaubt?



  • Ja natürlich habs nun umgeämndert. Bzgl den Umlauten das sollte natürlich ausgeklammert sein dient nur als Hinweis



  • Schau mal bei mir rein, die Funktionen selbst Funktionieren, aber ich gabe glaube ich noch irgenwie ein anderes problem. Vielleicht hilft dir das weiter.

    http://www.c-plusplus.net/forum/284072


Anmelden zum Antworten