Einfach verkettete Liste



  • Hallo,

    ich versuche eine verkettete Liste zu programmieren, komme aber nicht weiter.
    Und zwar sieht das Programm bisher so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct eintrag {
    	int key;
    	struct eintrag *p_next;
    } eintrag_t;
    
    typedef struct {
    	eintrag_t *p_head;
    	eintrag_t *p_search;
    	int length;
    } liste_t;
    
    eintrag_t *create_element (int key){
    	eintrag_t *element = (eintrag_t*) malloc(sizeof(eintrag_t));
    	element->key = key;
    	element->p_next = NULL;
    	return element;
    }
    
    void insert_element(liste_t *liste, eintrag_t *p_insert){
    }
    
    void print_list(liste_t liste){
    	int i;
    	liste.p_search = liste.p_head;
    	for(i=0; i<liste.length; i++)
        {
            printf("%d. Element: %d\n", i+1, liste.p_search->key);
            liste.p_search = liste.p_search->p_next;
        }
    }
    
    int main(void)
    {
        liste_t liste;
        liste.length = 0;
        int key;
        printf("Bitte geben Sie den Key ein.\n");
        printf("Wenn Sie kein Element mehr einfuegen wollen, geben Sie '0' ein.\n");
    
        printf("%d. Element: ", liste.length+1);
            scanf("%d", &key);
            liste.p_head = create_element(key);
            liste.length++;
            liste.p_search = liste.p_head->p_next;
    
        while(key != 0)
        {
            printf("%d. Element: ", liste.length+1);
            scanf("%d", &key);
            liste.p_search = create_element(key);
            liste.p_search = liste.p_search->p_next;
            liste.length++;
        }
        liste.p_search = NULL;
        printf("\n\n");
    
        print_list(liste);
    
        return 0;
    }
    

    Wenn ich das Programm ausführe, muss ich erst die Werte einlesen und dann sollen die Werte wieder ausgegeben werden. Jedoch gibt mein Programm nur den Wert vom ersten Element wieder aus und stürzt dann ab. Die Programmausgabe sieht so aus:

    Bitte geben Sie den Key ein.
    Wenn Sie kein Element mehr einfuegen wollen, geben Sie '0' ein.
    1. Element: 56
    2. Element: 443
    3. Element: 6
    4. Element: 12
    5. Element: 0

    1. Element: 56

    Könnt ihr vielleicht sehen, was ich falsch gemacht habe?
    Vielen Dank im voraus!



  • Warum ist der Member p_next in der struct ?

    Beschreibst du ihn überhaupt sinnvoll?



  • Jedoch gibt mein Programm nur den Wert vom ersten Element wieder aus und stürzt dann ab.

    Kein Wunder, du musst sämtliche Zeiger auf NULL setzen, ansonsten kommt immer ein Absturz.

    liste.length = 0;
    

    reicht nicht. Du könntest einfach ein memset machen:

    liste_t liste;
        memset(&liste, 0, sizeof(liste));
    

    Dann wärst du auf der sicheren Seite.

    Übrigens p_search scheint mir doch wenig sinnvoll. Das sieht mehr nach einer lokalen Variable aus.

    Konkret stürzt das Programm auf Zeile 31 ab, weil du auf Zeile 58 p_search auf NULL gesetzt hast.



  • Ok, Ich habe es jetzt überprüft.

    Der Grund für den Absturz ist, dass du niemals p_next auf etwas anderes als NULL setzt und auch nie prüfst, ob p_next NULL ist (in print_list(...))


Anmelden zum Antworten