Verkettete Liste
-
Hallo!
Wahrscheinlich habe ich unzählige Fehler in meinem Code, aber da ich noch nicht lange programmiere, habe ich einfach Schwierigkeiten sie zu finden. Dieses Programm soll eine verkettete Liste sein, wo jedes Listenelement drei Daten enthält. Darunter sind Funktionen zum Ausgeben, Einfügen und Löschen definiert, die anscheinend nicht laufen. Könnte mir den Code bitte jemand korrigieren, als Anfänger sehe ich gewisse Fehler einfach nicht...
#include <stdio.h> #include <stdlib.h> struct entry{ char name[20]; int Menge; int Kategorie; struct entry *next; }; struct entry*kopf; void ausgeben(void) { struct entry *cursor = kopf->next; printf("....Liste..........\n"); while (cursor != cursor->next) { printf("%s\n", cursor->name); cursor = cursor->next; } printf("....Listenende.....\n\n"); } void add(struct entry* left, struct entry* element){ struct entry*aktuell; element = (struct elem*) malloc(sizeof(struct entry)); if (element == NULL) { printf(".......Speicherplatzmangel\n"); exit(1); } aktuell=kopf; while(aktuell->next != left->next){ aktuell=aktuell->next; } element->next=aktuell->next; aktuell->next=element; } void delete(struct entry* left){ struct entry *aktuell1,*aktuell2; struct entry* kopf; if(left==kopf){ free(kopf); kopf=kopf->next; }else if(left->next->next==NULL){ aktuell1=kopf; aktuell2=aktuell1->next; while(aktuell2->next!= NULL) { aktuell1=aktuell2; aktuell2=aktuell1->next; } free(aktuell1->next); aktuell1->next=NULL; if(kopf==aktuell1) kopf=NULL; } else{ aktuell1=kopf; aktuell2=aktuell1->next; while(aktuell2!=left){ aktuell1=aktuell2; aktuell2=aktuell1->next; } free(aktuell1->next); aktuell1->next=aktuell2->next; } } int main(){ char name[20]; int Menge, Kategorie; struct entry*element; printf("\nGib den einzufuegenden Namen ein: "); scanf("%s",&element->name); printf("\nGib die Menge ein:"); scanf("%s",&element->Menge); printf("\nGib die Kategorie ein:"); scanf("%s",&element->Kategorie); add( kopf , element); ausgeben(); getchar(); return 0; }
-
Hi,
Apeiron schrieb:
Hallo!
Wahrscheinlich habe ich unzählige Fehler in meinem Code, aber da ich noch nicht lange programmiere, habe ich einfach Schwierigkeiten sie zu finden. Dieses Programm soll eine verkettete Liste sein, wo jedes Listenelement drei Daten enthält. Darunter sind Funktionen zum Ausgeben, Einfügen und Löschen definiert, die anscheinend nicht laufen. Könnte mir den Code bitte jemand korrigieren, als Anfänger sehe ich gewisse Fehler einfach nicht...
Dann solltest du noch einmal von vorn anfangen und mit einer Funktion beginnen,
die du verstehst. Ich schlage folgende Reihenfolge vor:
Neues Listenelement erzeugen, Listenelement mit Daten bereichern, Listenelement anhängen,
Liste anzeigen, Liste löschen.typedef struct my_element MyElement; struct my_element { //.. MyElement* next; }; typedef struct my_list { unsigned size; MyElement* first; }MyList; MyElement* new_element() { // ... } void set_data ( MyElement* e, void* data ) { // ... } void show_list ( MyList* l ) { // ... } void delete_list ( MyList* l ) { // ... }
-
Hallo!
Soviel Zeit habe ich leider nicht. Aber ich habe einige Korrekturen vorgenommen. Vlt. hat ja jetzt jemand Lust mir zu helfen:
#include <stdio.h> #include <stdlib.h> struct entry{ char name[20]; int Menge; int Kategorie; struct entry *next; }; struct entry*kopf; void ausgeben(void) { struct entry *cursor = kopf->next; printf("....Liste..........\n"); while (cursor != cursor->next) { printf("%s,%i,%i\n", cursor.name,cursor.Menge,cursor.Kategorie); cursor = cursor->next; } printf("....Listenende.....\n\n"); } void add(struct entry* left, struct entry* element){ struct entry*aktuell; element = (struct elem*) malloc(sizeof(struct entry)); if (element == NULL) { printf(".......Speicherplatzmangel\n"); exit(1); } aktuell=kopf; while(aktuell->next != left->next){ aktuell=aktuell->next; } element->next=aktuell->next; aktuell->next=element; } void delete(struct entry* left){ struct entry *aktuell1,*aktuell2; struct entry* kopf; if(left==kopf){ free(kopf); kopf=kopf->next; }else if(left->next->next==NULL){ aktuell1=kopf; aktuell2=aktuell1->next; while(aktuell2->next!= NULL) { aktuell1=aktuell2; aktuell2=aktuell1->next; } free(aktuell1->next); aktuell1->next=NULL; if(kopf==aktuell1) kopf=NULL; } else{ aktuell1=kopf; aktuell2=aktuell1->next; while(aktuell2!=left){ aktuell1=aktuell2; aktuell2=aktuell1->next; } free(aktuell1->next); aktuell1->next=aktuell2->next; } } int main(){ char name[20]; int Menge, Kategorie; struct entry*element; printf("\nGib den einzufuegenden Namen ein: "); scanf("%s",&element.name); printf("\nGib die Menge ein:"); scanf("%s",&element.Menge); printf("\nGib die Kategorie ein:"); scanf("%s",&element.Kategorie); add( kopf ,element); ausgeben(); getchar(); return 0; }
-
Apeiron schrieb:
Hallo!
Vlt. hat ja jetzt jemand Lust mir zu helfen:
eher nicht wenn du
- einfach nen Haafen Code hinklatsch
- nicht einmal erkärst, wo genau du Probleme hast.
-
Apeiron schrieb:
Vlt. hat ja jetzt jemand Lust mir zu helfen:
klar, sag wo's zickt, dann helfen wir bestimmt. also, was funzt nicht in deinem code?
-
ein vernünftiges einrücken wäre schon sehr hilfreich, auch für dich, um
fehler zu finden.das ende einer liste wird normalerweise mit 0 markiert.
deine liste scheint das aktuelle element als endwert zu nehmen.
desweiteren musst du bei "kopf" anfangen, nicht bei "kopf->next".eine weitere struktur für die liste ist zwar nicht notwenig, aber empfehlenswert.
ich persönlich würde als erstes mit der ausgabefunktion anfangen, dann kannst
du immer überprüfen ob eine andere funktion richtig funktioniert.
-
Ich weiß nur das das Programm nicht läuft. Wenn ich wüsste was nicht funtzt. würde ich mich wohl kaum hier melden. Was erwartet ihr eigentlich von mir?
Das eigentlich schwierige ist es ja gerade das Problem zu finden. Wenn ich genau wüsste wo es liegt wäre mir schon sehr geholfen.Gruß
-
Apeiron schrieb:
Was erwartet ihr eigentlich von mir?
dass du z.b. die fehler beschreibst (fehlermeldungen des compilers, linkers, laufzeitfehler, sonstige auffälligkeiten, usw.). sonst müssen wir annehmen, dass du dich damit nicht auseinandersetzen willst und sowas wird hier nicht gern gesehen.
-
Ok.
ompiler: Default compiler
Führt gcc.exe... aus
gcc.exe "C:\Dev-Cpp\6-3-Mutschlechner.c" -o "C:\Dev-Cpp\6-3-Mutschlechner.exe" -pg -g3 -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -lgmon -pg -g3
C:\Dev-Cpp\6-3-Mutschlechner.c: In functionausgeben': C:\\Dev-Cpp\\6-3-Mutschlechner.c:20: error: request for member
name' in something not a structure or union
C:\Dev-Cpp\6-3-Mutschlechner.c:20: error: request for member `Menge' in something not a structure or unionC:\Dev-Cpp\6-3-Mutschlechner.c:20: error: request for member `Kategorie' in something not a structure or union
C:\Dev-Cpp\6-3-Mutschlechner.c: In function
main': C:\\Dev-Cpp\\6-3-Mutschlechner.c:112: error: request for member
Menge' in something not a structure or union
C:\Dev-Cpp\6-3-Mutschlechner.c:117: error: request for member `Kategorie' in something not a structure or unionAusführung beendet
Ich verstehe nicht genau, was das heißen soll. Ich habe gehört,dass man so wie in Zeile 20 Strukturelemente ausgeben kann. Was stimmt hier nicht?
Gruß
-
Hallo nochmal!
Ok. jetzt habe ich euren Rat befolgt und starte einen neuen Versuch um wirklich von klein auf das ganze Programm aufzubauen. Obwohl ich nicht glaube, dass alles was ich geschrieben habe totaler Schrott ist. Ich habe in meinem Buch extra nochmal nachgelesen wie das mit dem initialisieren von Listen geht. Trotzdem sagt der Compiler:"Conflicting types for kopf".Was soll das heißen?Darf ich kopf nicht auf Null zeigen lassen, sondern muss ich eine eigene structur erzeugen auf die kopf zeigt?
#include <stdio.h> #include <stdlib.h> struct entry{ char name[20]; int Menge; int Kategorie; struct entry *next; }; struct entry *kopf; struct entry *neu; kopf=NULL; neu=(*struct entry)malloc(sizeof(struct entry)); neu->next=kopf; kopf=neu; neu->Menge=3; neu->Kategorie=3; neu->name=Hans; void ausgeben(){ struct entry*akt; while(akt!=NULL){ printf("%s",akt->name); print("%i",akt->Kategorie); printf("%i",akt->Menge); akt=akt->next; } int main(){ ausgeben(); getchar(); return 0; }
-
Apeiron schrieb:
Obwohl ich nicht glaube, dass alles was ich geschrieben habe totaler Schrott ist.
Jedenfalls hast du es jetzt geschafft voll den Schrott hier reinzurotzen, Glückwunsch!
Kein Ansi C, compiliert nicht, Einrückungen und Aussehen voll von A....
-
Apeiron schrieb:
Obwohl ich nicht glaube, dass alles was ich geschrieben habe totaler Schrott ist.
aber so ziemlich.
1. der code hinter der struct-definition muss in eine funktion rein (main z.b.). in c gibts keinen code ausserhalb von funktionen.
2. der cast vor dem malloc ist unnötig (und syntaxmässig auch falsch)
^^bau das um, vielleicht geht's ja dann.
-
Danke!
Ok. die Ausgabe läuft nun einigermaßen. Wobei noch 2 Probleme auftreten:
1.Vor es mir die 2 Dreien ausgibt gibt es aus mir unbekannten Gründen < : > aus.
2. Wenn ich neu->name={'u'}; schreibe gibt der Compiler eine Fehlermeldung. Also kann ich Name noch nicht mit einen Wert belegen.
Jetzt habe ich auch noch die 2. Funktion add geschrieben, wobei wenn ich so das Program ausführe Windows das Programm beenden muss. Kann mir bitte jemand sagen was nicht stimmmt?#include <stdio.h> #include <stdlib.h> struct entry{ char name[20]; int Menge; int Kategorie; struct entry *next; }; void ausgeben(struct entry*kopf){ struct entry*akt; akt=kopf; while(akt!=NULL){ printf("%s",akt->name); printf("%i",akt->Kategorie); printf("%i",akt->Menge); akt=akt->next; } } void add(struct entry* left, struct entry* element){ struct entry*aktuell; /*element = (struct entry*) malloc(sizeof(struct entry));*/ if (element == NULL) { printf(".......Speicherplatzmangel\n"); exit(1); } aktuell=NULL; while(aktuell->next != left->next){ aktuell=aktuell->next; } element->next=aktuell->next; aktuell->next=element; } int main(){ struct entry *kopf; struct entry *neu; kopf=NULL; neu=malloc(sizeof(struct entry)); neu->next=kopf; kopf=neu; neu->Menge=3; neu->Kategorie=3; ausgeben(kopf); struct entry *element=(struct entry*)malloc(sizeof(struct entry)); printf("\nGib den einzufuegenden Namen ein: "); scanf("%s",&(*element).name); printf("\nGib die Menge ein:"); scanf("%s",&(*element).Menge); printf("\nGib die Kategorie ein:"); scanf("%s",&(*element).Kategorie); add( kopf ,element); ausgeben(kopf); getchar(); return 0; }
@_0_Dein saudummes Kommentar hat mir echt geholfen, danke!