Verkettete Listen und struct - Listenausgbe [Neuling)



  • Guten Tag,

    ich habe mich bereits in eurem Forum ungesehen, konnte aber nicht passendes finden was zu meinem Problem passt.

    Wir sollen eine struct definieren und dann eine Funktion namens struct List *createList(void) schreiben, die eine leere Liste erzeugt und wiedergibt.
    Den Speicher sollen wir per calloc reservieren. Dabei sind generell einige Sachen vorgegeben, wesewegen ich da momentan nicht durchsteige.

    Mein Ansatz:

    struct List 
    {							// Die "Struktur" Liste besteht aus den Elementen
    	struct Node *nodes;		// der Struktur Node, welche im Anschluss steht.
    };
    
    struct Node
    {
    	int i;
    	struct Node *next;
    };
    
    struct List *list;		// "Listenpointer"
    struct List *I = calloc(1, sizeof (struct List)); // so soll der Speicher laut Unterlagen reserviert werden, allerdings ist der Initialisierer *I nicht konstant.
    
    // Mein Ansatz für die leere Liste: Der Pointer auf den Listenanfangs (*head) der struct Liste wird auf NULL gesetzt und wenn der head == NULL wird der print-Text ausgegeben, ansonsten der Inhalt der Liste.
    
    // Allerdings klappt das so nicht.
    
    struct List *createList(void)
    {
    	struct List *list = NULL;
    		if(list == NULL){
    			printf("Die Liste ist leer!\n");
    		}
                    else {
                    ...
                    }
    
    }
    

    Könnt ihr mir vlt. helfen und mir meine Fehler aufzeigen?
    Vielen Dank für eure Mühe.

    Gruß Dutz



  • Vence schrieb:

    ...
    // Hier werden globale Variablen definiert.
    struct List *list; // "Listenpointer"
    struct List *I = calloc(1, sizeof (struct List)); // so soll der Speicher laut Unterlagen reserviert werden, allerdings ist der Initialisierer *I nicht konstant.

    // Mein Ansatz für die leere Liste: Der Pointer auf den Listenanfangs (*head) der struct Liste wird auf NULL gesetzt und wenn der head == NULL wird der print-Text ausgegeben, ansonsten der Inhalt der Liste.

    // Allerdings klappt das so nicht.

    struct List *createList(void)
    {
    struct List *list = NULL; // Das hier ist eine lokale Variable die auf NULL gestzt wird
    if(list == NULL){ // Hier fragst du diese lokale Varibale auch gleich wieder ab.
    printf("Die Liste ist leer!\n");
    }
    else {
    ...
    }

    }
    [/code]

    Das globale *list brauchst du nicht.
    Das lokale list musst du mit dem nodes aus dem globalen *I initialisieren



  • Danke für deine Hilfe, aber ich stehe noch immer etwas auf dem Schlauch. 😕

    Ein "Knoten" bzw. Listenelement besteht ja aus Daten und einem Zeiger auf das nächste Element. Wenn ich Speicher allokiere sieht das ja für das erste Element beispielsweise so aus:

    Man erzeugt eine temporäre Variable (Z.B.: list head), weist die Elemente zu und lässt das Element auf NULL enden.

    head = (list) calloc(1, sizeof(struct List));
    head -> data = data;
    head -> next = NULL;

    Ich komme aber einfach nicht darauf, wie ich

    *Das lokale list musst du mit dem nodes aus dem globalen I initialisieren

    soll.



  • Das Element nodes von I zeigt doch auf das erste Element der liste.

    struct List *createList(void)
    {
        struct List *list = I->nodes;  // Eine Zeiger der auf das gleiche Element zeigt wie nodes aus I
    
    ...
    

    Und:

    head = (list) calloc(1, sizeof(struct List));
    // Der ^^^^^^ cast ist in C überflüssig 
    // Ist [c]list [/c]überhaupt ein Zeigertyp auf struct List?
    head -> data = data;
    head -> next = NULL;
    

Anmelden zum Antworten