Einfach verkettete Listen.



  • Hallo,
    ich bin gerade dabei C zu lernen und will folgenden Code, zu den einfach verketteten Listen, kompilieren. Jedoch klappt das nicht so ganz. Kann mir vielleicht jemand helfen?

    Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct lagerverwaltung{
    	long artikelnr;
    	char artikelbezeichnung[100];
    	int anzahl_artikel;
    	struct lagerverwaltung *next;
    	};
    
    struct lagerverwaltung *first = NULL;
    
    void read_lagerverwaltung ()
    {
    	long an;
    	char ab[100];
    	int az;
    
    	printf("Art.Nr.:");
    	scanf("%d",&an);
    
    	printf("Art.Bezeichnung:");
    	fgets(ab,sizeof(ab),stdin);
    
    	printf("Art.Anzahl:");
    	scanf("%d",&az);
    
    	insert_lagerverwaltung (an,ab,az);
    }
    
    void insert_lagerverwaltung (long artnr,char artbez [], int artanz)
    {
    	struct lagerverwaltung *lager_ptr;//zeiger für die "verwaltung"
    	if (first == NULL)//erste Element hinzufügen
    	{
    		first = (struct lagerverwaltung *)malloc(sizeof(struct lagerverwaltung));
    		if (first == NULL)
    			exit (0);
    		else
    		{
    			first->artikelnr = artnr;
    			first->artikelbezeichnung = artbez;
    			first->anzahl_artikel = artanz;
    			first->next = NULL;
    		}
    	}
    	else
    	{
    		lager_ptr = first;
    
    		while(lager_ptr->next != NULL)
    			lager_ptr = lager_ptr->next;
    		lager_ptr->next = (struct lagerverwaltung *)malloc(sizeof(struct lagerverwaltung));
    		if (lager_ptr->next == NULL)
    			exit(0);
    		else
    		{
    			lager_ptr = lager_ptr->next;
    			lager_ptr->artikelnr = artnr;
    			lager_ptr->artikelbezeichnung = artbez;
    			lager_ptr->anzahl_artikel = artanz;
    			lager_ptr->next = NULL;//ende der Liste deklariert	
    		}
    	}
    	printf("Great\n");
    }
    void lager_out ()
    {
    	struct lagerverwaltung *lager_ptr;//zeiger zur "Verwaltung"
    
    	if (lager_ptr == NULL)
    		exit (0);
    	else 
    	{
    		while(lager_ptr != NULL)liste
    		printf("%ld\n",lager_ptr->artikelnr);
    		printf("%c\n",lager_ptr->artikelbezeichnung);
    		printf("%d\n",lager_ptr->anzahl_artikel);
    
    		lager_ptr = lager_ptr->next;
    	}
    }
    
    int main()
    {
    	int abf;
    
    	do{
    
    	printf("<1> Neue Daten einlesen\n");
    	printf("<2> Alle Daten ausgeben\n");
    	printf("<3> Ende\n");
    	scanf("%d",&abf);
    
    	switch (abf)
    	{
    		case 1	:	read_lagerverwaltung();break;
    		case 2	:	lager_out();break;
    		case 3	:	break;
    		default	:	printf("Ungueltige Eingabe\n");
    	}
    
    	}while (abf!=3);
    
    	return 0;
    
    }
    

    Fehlermeldung beim kompilieren:

    Dyn.Strct..c:33: warning: conflicting types for ‘insert_lagerverwaltung’
    Dyn.Strct..c:29: warning: previous implicit declaration of ‘insert_lagerverwaltung’ was here
    Dyn.Strct..c: In function ‘insert_lagerverwaltung’:
    Dyn.Strct..c:43: error: incompatible types in assignment
    Dyn.Strct..c:61: error: incompatible types in assignment

    danke schon mal im voraus!

    P3trus.



  • Bei der While-Schleife in Zeile 76 bis 81 fehlen geschweifte Klammern. Das "liste" hat wohl auch keine Bedeutung.

    In Zeile 29 rufst du die Funktion "insert_lagerverwaltung" auf, von der der Compiler erst ab Zeile 32 weiß, daß es die gibt. Deklariere deine Funktionen am Besten ganz oben im Quelltext, damit der Compiler bescheid weiß:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void read_lagerverwaltung ();
    void insert_lagerverwaltung (long artnr,char artbez [], int artanz);
    void lager_out ();
    


  • "first->artikelbezeichnung = artbez; "

    Das geht nicht. Du musst die Funktion strcpy verwenden:

    strcpy(first->artikelbezeichnung, artbez);



  • Hallo,
    Danke erstmal für eure antworten!
    Habe jetzt alles korrigiert und es gibt keine Probleme beim kompilieren des Codes. Jedoch beim ausführen des Programms:

    Noch mal der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void read_lagerverwaltung();
    void insert_lagerverwaltung (long artnr,char artbez [], int artanz);
    void lager_out ();
    
    struct lagerverwaltung{
    	long artikelnr;
    	char artikelbezeichnung[100];
    	int anzahl_artikel;
    	struct lagerverwaltung *next;
    	};
    
    struct lagerverwaltung *first = NULL;
    
    void read_lagerverwaltung ()
    {
    	long an;
    	char ab[100];
    	int az;
    
    	printf("Art.Nr.:");
    	scanf("%d",&an);
    
    	printf("Art.Bezeichnung:");
    	fgets(ab,sizeof(ab),stdin);
    
    	printf("Art.Anzahl:");
    	scanf("%d",&az);
    
    	insert_lagerverwaltung (an,ab,az);
    }
    
    void insert_lagerverwaltung (long artnr,char artbez [], int artanz)
    {
    	struct lagerverwaltung *lager_ptr;
    	if (first == NULL)
    	{
    		first = (struct lagerverwaltung *)malloc(sizeof(struct lagerverwaltung));
    		if (first == NULL)
    			exit (0);
    		else
    		{
    			first->artikelnr = artnr;
    			strcpy(first->artikelbezeichnung, artbez);
    			first->anzahl_artikel = artanz;
    			first->next = NULL;		}
    	}
    	else
    	{
    		lager_ptr = first;
    		while(lager_ptr->next != NULL)
    			lager_ptr = lager_ptr->next;
    		lager_ptr->next = (struct lagerverwaltung *)malloc(sizeof(struct lagerverwaltung));
    		if (lager_ptr->next == NULL)
    			exit(0);
    		else
    		{
    			lager_ptr = lager_ptr->next;
    			lager_ptr->artikelnr = artnr;
    			strcpy(lager_ptr->artikelbezeichnung,artbez);
    			lager_ptr->anzahl_artikel = artanz;
    			lager_ptr->next = NULL;//ende der Liste deklariert	
    		}
    	}
    	printf("Great\n");
    }
    void lager_out ()
    {
    	struct lagerverwaltung *lager_ptr;
    
    	if (lager_ptr == NULL)
    		exit (0);
    	else 
    	{
    		while(lager_ptr != NULL)
    		{
    		printf("%ld\n",lager_ptr->artikelnr);
    		printf("%c\n",lager_ptr->artikelbezeichnung);
    		printf("%d\n",lager_ptr->anzahl_artikel);
    		}
    		lager_ptr = lager_ptr->next;
    	}
    }
    
    int main()
    {
    	int abf;
    
    	do{
    
    	printf("<1> Neue Daten einlesen\n");
    	printf("<2> Alle Daten ausgeben\n");
    	printf("<3> Ende\n");
    	scanf("%d",&abf);
    	fflush(stdin);
    	switch (abf)
    	{
    		case 1	:	read_lagerverwaltung();break;
    		case 2	:	lager_out();break;
    		case 3	:	break;
    		default	:	printf("Ungueltige Eingabe\n");
    	}
    
    	}while (abf!=3);
    
    	return 0;
    
    }
    

    Beim ausführen wird dann erst folgendes angezeigt:

    <1> Neue Daten einlesen
    <2> Alle Daten ausgeben
    <3> Ende

    Dann wähle ich die 1 und gebe irgendeine Zahl für die Artikelnr. ein. Danach passiert aber was ganz eigenartiges:

    Art.Nr.:1234
    Art.Bezeichnung:Art.Anzahl: <- Ich werde gar nicht aufgefordert eine Art.Bezeichnung einzugeben sondern muss gleich die Anzahl angeben.

    Anschließend befinde ich mich wieder im "Hauptmenue". Wenn ich dann die 2 auswähle, hat dies eine Endlos-Schleife zur Folge:

    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    -2087905164
    -679244453
    ?
    .
    .
    .
    .
    .
    ...usw.

    Hat jemand eine Idee wo hier das Problem liegt ?

    Vielen Dank für jede Antwort.

    Mfg P3trus



  • In der Funktion "lager out()":

    "struct lagerverwaltung *lager_ptr;" ist nicht initialisiert. Ich nehme an, es muss "struct lagerverwaltung *lager_ptr = first;" heißen.

    Außerdem gehört "lager_ptr = lager_ptr->next;" auf alle Fälle in die while-Schleife.

    Bei "printf("%c\n",lager_ptr->artikelbezeichnung);" ist der Formatbezeichner falsch. "%c" steht für ein einzelnes Zeichen. Hier musst du aber "%s" für String(char array) verwenden.

    void lager_out ()
    {
        struct lagerverwaltung *lager_ptr=first;
    
        if (lager_ptr == NULL)
            exit (0);
        else
        {
            while(lager_ptr != NULL)
            {
            printf("%ld\n",lager_ptr->artikelnr);
            printf("%s\n",lager_ptr->artikelbezeichnung);
            printf("%d\n",lager_ptr->anzahl_artikel);
            lager_ptr = lager_ptr->next;
            }
        }
    }
    

    In der read_lagerverwaltung():

    Nach jedem scanf() solltes du den Tastaturpuffer leeren, denn scanf() liest entweder bis zur Enter-Sequenz('\n') oder soviele Zeichen, wie du es hast lesen lassen. Rest(also auch das Enter-Zeichen) bleibt im Puffer und wird von der nächsten Lese-Funktion eingelesen.

    Den Tastaturpuffer leerst du entweder mit fflush(stdin); oder mit while(getchar()!='\n');
    Das letztere sollte eher benutzt werden, weil systemunabhängiger.

    void read_lagerverwaltung ()
    {
        long an;
        char ab[100];
        int az;
    
        printf("Art.Nr.:");
        scanf("%d",&an);
        while(getchar()!='\n');
    
        printf("Art.Bezeichnung:");
        fgets(ab,sizeof(ab),stdin);
    
        printf("Art.Anzahl:");
        scanf("%d",&az);
        while(getchar()!='\n');
    
        insert_lagerverwaltung (an,ab,az);
    }
    

    Zusätzlich solltest du zusehen, dass du den durch malloc() allokierten Speicher wieder freigibst, sonst dürfest du deinen Arbeitsspeicher irgendwann komplett zugemüllt vorfinden. Wie das geht, erfährst du hier: http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_023_000.htm#RxxobKap02300004002BA91F0101E7



  • Jetzt funktioniert es einwandfrei! Vielen Dank!


Anmelden zum Antworten