Warum geht meine Liste nicht?



  • Ich versuche eine Liste mit 2 Elementen nach dem Muster auf Wikipedia zu erstellen allerdings komm ich mit meinen Zeigern nicht klar.

    #include <stdio.h>
    #include <stdlib.h>
    
    struct element {
        int value; // der Wert des Elements
        struct element *next; // das nächste Element
    };
    
    void printliste(struct element *l) {
        struct element *liste;
        liste=l;
        printf ("%d\n", liste->value);
        while (liste->next != NULL) {
            liste=liste->next;
            printf ("%d\n", liste->value);
        }
    }
    
    void append(struct element **liste, int value)
    {
        struct element *nElement;
        struct element *node = *liste;
    
        nElement = (struct element*) malloc(sizeof(*nElement)); // erzeuge ein neues Element
        nElement->value = value;
        nElement->next = NULL; // Wichtig für das Erkennen des Listenendes
    
        if ( node != NULL ) { // sind Elemente vorhanden
            while (node->next != NULL ) // suche das letzte Element
                node=node->next;
            node->next=nElement; // Hänge das Element hinten an
        }
        else // wenn die liste leer ist, bin ich das erste Element
            *liste=nElement;
    }
    
    int main()
    {
        struct element *Liste;
        Liste = NULL; // init. die Liste mit NULL = leere liste
        append(&Liste, 1); // füge neues Element in die Liste ein
        append(&Liste, 3); // füge neues Element in die Liste ein
        append(&Liste, 2); // füge neues Element in die Liste ein
    
        printliste(Liste); // zeige liste an
        return EXIT_SUCCESS;
    }
    

    und hier ist mein Versuch:

    #include<stdlib.h>
    #include<stdio.h>
    
    struct elem {
    	int value;
    	struct elem *next;
    };
    
    int main() {
    	struct elem *liste, *element;
    
    	liste = NULL;		
    
    //hier wird ein Fehler angezeigt
    //ich versuche den Zeiger node auf die adresse von liste zeigen zu lassen
    	struct element *node = liste;
    
    	element = (struct elem*) malloc(sizeof(*element));	
    	element->value = 9;
    	element->next = NULL;
    	liste = element;
    
    	element = (struct elem*) malloc(sizeof(*element));
    	element->value = 8;
    	element->next = NULL;
    //beide nachfolgende anweisungen werden als falsch angezeigt
    /*hier versuche ich dem next welches im Moment auf NULL steht das neue element zuzuweisen*/
    	node->next = element;
    //hier soll node nun auf das angehängte Listenelement zeigen	
            node = node->next;
    
    	printf("%d %d", liste->value, liste->next->value);
    
    	system("pause");
    	return 0;
    }
    

    ich verstehe nicht warum es nicht geht!

    Wenn ihr antwortet erklärt mir bitte ausführlich was da falsch ist und nicht nur das es falsch ist, denn das weiß ich selber

    Danke im Voraus.


  • Mod

    Da du keine Fehlermeldung nennst, rate ich mal: Du benutzt C nach 1989er Standard (zum Beispiel Microsoft Compiler), da ist es nicht erlaubt, Variablen im Block zu definieren.



  • Zu Zeile 16:
    gibt es denn bei dir eine struct element?



  • stimmt sollte struct elem heißen

    so nun bekomme ich keine Fehlermeldungen mehr allerdings hängt sich das Programm beim ausführen sofort auf ohne eine Fehlermeldung etc.

    Ich nutze MinGW und daraus den gcc ohne zusätzliche Parameter - vermute, dass er dann automatisch den c99 Standard nutzt - weiß es aber nicht!

    Wäre nett wenn ihr mir helfen könntet.



  • int main() {
        struct elem *liste, *element;
    
        liste = NULL;      
    
        struct elem *node = liste;  // node zeigt jetzt auf NULL
    
        element = (struct elem*) malloc(sizeof(*element)); 
        element->value = 9;
        element->next = NULL;
        liste = element;            // liste zeigt jetzt auf element
    
        element = (struct elem*) malloc(sizeof(*element));
        element->value = 8;
        element->next = NULL;
    
        printf("liste:%p node:%p", liste, node);   
        node->next = element;   // wo zeigt denn node hin? siehe Zeile 6
        node = node->next;
    
        printf("%d %d", liste->value, liste->next->value);
    
        system("pause");
        return 0;
    }
    


  • alles klar jetzt seh ich den Fehler, denn node Zeigt immer noch auf NULL

    Wie müsste ich node verändern, dass es funktioniert?

    also irgendwie vermute ich, dass ich **node = &liste; machen muss, so dass er nicht auf Null sondern auf die Liste Zeigt und dann kann ich mit node auch irgendwie auf next zeigen

    könnte es bitte iwer korrigieren, so dass es funktioniert ich mach da immer noch was falsch



  • habs

    struct elem **node = &liste;
    
    (*node)->next = element;
    	node = &((*node)->next);
    

    Danke an alle!



  • Zu umständlich.

    Verzichte auf node.



  • und wie soll ich dann meinen anchor - liste wiederfinden?



  • Über die Variable liste
    Dafür ist sie ja da.



  • wenn ich die variable liste verschiebe finde ich ja die wurzel nicht mehr oder ich muss eine doppelt verkettete Liste machen



  • Du sollst doch liste nicht verschieben. liste ist der Startpunkt

    Du hast aber nur zwei Einträge in die Liste. Daher brauchst du node nicht.

    Wenn doch, dann reicht ein node = liste; auch aus.


Anmelden zum Antworten