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 assignmentdanke 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> EndeDann 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!