Verkettete Liste
-
Hallo,
ich muss für die anstehende Informatik-Klausur verkettete Listen können. Habe aber kein richtiges Beispiel und bekomme mega viele Fehler ausgegeben. Es wäre echt nett, wenn mir jemand dabei helfen könnte. Im Internet werd ich selber nämlich auch nicht wirklich schlauer. Danke schonmal im Voraus.
#include <stdio.h> #include <stdlib.h> /* * */ struct adr_struktur { long pnr; char vname[32]; char nname[32]; char strasse[32]; char plz; char ort[32]; struct adr_struktur *next; struct adr_struktur adr; void adresseingabe(struct adr_struktur *adresse) int main() { struct adr_struktur adr[10]; int i; for(i=0; i<10; i++); adresseingabe(&adr[i]); return(0); } void adresseingabe(struct adr_struktur *adresse) { printf("Personalnummer: \n"); scanf("%ld", &adresse->pnr); printf("Vorname: \n"); scanf("%s", adresse->vname); printf("Nachname: \n"); scanf("%s", adresse->nname); printf("Straße: \n"); scanf("%s", adresse->strasse); printf("Postleitzahl: \n"); scanf("%s", &adresse->plz); printf("Ort: \n"); scanf("%s", &adresse->ort); } struct adr_struktur *anfang=NULL; struct adr_struktur *aktuell=NULL; if anfang==NULL { anfang=calloc(1,sizeof(adr_struktur)); if (adr==NULL) { printf("\nFEHLER!\n"); } adresseingabe(anfang); anfang->next=NULL; } struct adr_struktur tempstru; struct adr_struktur *hilfszeiger; adresseingabe(&tempstru); if (anfang==NULL) { anfang=calloc(1, sizeof(adr_struktur)); adressuebernahme(anfang, &tempstru); anfang->next=NULL; } else { aktuell=anfang; while((aktuell->next!=NULL)&&(aktuell->pnr<tempstru.pnr)); aktuell=aktuell->next; } if((aktuell->next==NULL)&&(aktuell->pnr<tempstru.pnr)) { aktuell->next=calloc(1, sizeof(adr_struktur)); aktuell=aktuell->next; adressuebernahme(aktuell, &tempstru); aktuell->next=NULL; } else if((aktuell==anfang)&&aktuell->pnr>tempstru.pnr) { anfang=calloc(1, sizeof(adr_struktur)); anfang->next=aktuell; adressuebernahme(anfang, &tempstru); } else { hilfszeiger=anfang; while(hilfszeiger->next!=aktuell) hilfszeiger=hilfszeiger->next; aktuell=calloc(1, sizeof(adr_struktur)); adressuebernahme(aktuell, &tempstru); aktuell->next=hilfszeiger->next; hilfszeiger->next=aktuell; } } } void adressuebernahme(struct adr_struktur *adrziel), struct adr_struktur *adrquelle) { adrziel->pnr=adrquelle->pnr; strcpy(adrziel->vname, adrquelle->vname); strcpy(adrziel->nname, adrquelle->nname); strcpy(adrziel->strasse, adrquelle->strasse); adrziel->plz=adrquelle->plz; strcpy(adrziel->ort, adrquelle->ort); }
in Zeile 18 steht: unable to resolve identifier adresse
was bedeutet das? dass es nicht deklariert wurde? wenn ja, als was muss ich das deklarieren und wo? (ich dachte es ist dadurch schon deklariert)
in Zeile 19 steht: unable to resolve identifier main (da ist es ja dann eigentlich das gleiche Problem, aber main muss man doch nicht deklarieren, dass ist doch eine Standardfunktion dachte ich. Außerdem steht da noch: unexpected token: int, unexpected token: ( und unexpected token: )
Der nächste Fehler kommt dann in Zeile 22: Unable to resolve identifier i
genauso in den Zeilen darunter (wo i vorkommt)
In Zeile 26 steht dann: unexpected token: }
In Zeile 27 kommt dann wieder: unable to resolve identifier adresse
genauso in den Folgezeilen.
In Zeile 44 kommen dann wieder eine Reihe von Fehlern: unable to resolve identifier: anfang (das hab ich doch 2 Zeilen vorher deklariert oder nicht?)
unexpected token: if, unexpected token: anfang, unexpected token: ==, unexpected token: ( (aber hier habe ich nirgends eine Klammer gesetzt...)
In Zeile 46 kommt dann wieder: unable to resolve identifier: anfang
In Zeile 47: Unable to resolve identifier: adr
In Zeile 51: Unable to resolve identifier: adresseingabe (das ist eine Funktion, die weiter unten noch kommt. Wieso erkennt das Programm das nicht?)
Unable to resolve identifier: anfang
In Zeile 52: Unable to resolve identifier: anfang
In Zeile 53: Unexpected token: }
In Zeile 56: Unable to resolve identifier: tempstru
In Zeile 57: unable to resolve identifier: anfang, unexpected token: if, unexpected token: (, unexpected token: anfang, unexpected token: ==, unexpected token: ... (Ich hab hier keine 3 Punkte gesetzt)
Zeile 59: Unable to resolve identifier: anfang
Zeile 60: Unable to resolve identifier: adressuebernahme, Unable to resolve identifier: anfang, Unable to resolve identifier: tempstru
Zeile 61: Unable to resolve identifier anfang
Zeile 62: Unexpected token: }
Zeile 63: Unexpected token: else
Zeile 65: Unable to resolve identifier aktuell, unable to resolve identifier anfang
Zeile 66: Unable to resolve identifier aktuell, unable to resolve identifier aktuell, unable to resolve identifier tempstru
Zeile 67: Unable to resolve identifier aktuell, Unable to resolve identifier aktuell
Zeile 68: Unexpected token: }
Zeile 69: Unexpected token: if, Unexpected token: ( , Unexpected token: ( , Unexpected token: aktuell, Unexpected token: -> (das geht dann noch die ganze Zeile so weiter)
Und bis zum Ende hin wirft er nur solche Fehler aus. In der letzten Zeile sagt er noch: Unexpected end of file
-
Überprüfe doch mal wo deine Struktur-Deklaration endet, und ob du alle ; an der richtigen Stelle hast.
Wichtig ist meist der erste Fehler, der Rest sind meist Folgefehler.
Der Fehler kann durchaus in den Zeilen davor liegen.
Und wenn du den C/C++ Button (bzw die cpp-Tags) nimmst, wird dein Code sogar farbig. Dadurch kann man auch schon einige Fehler erkennen.
-
Zeile 13? -> möglich, aber nicht wahrscheinlich
Warum formatierst du den Quelltext nicht übersichtlich
Wenn
int main(...
nach systematischen formatieren nicht vorn in der Zeile beginnt, hast du in den Zeilen vorher eine geschweifte Klammer vergessen.
Hab den Rest nur überflogen: Soll Zeile 23 so enden?
Wenn du im Netz zu diesem Thema gar nicht fündig wirst, solltest du das mit der Suche optimieren. Okay, pro Treffer 5 bis 10 Nieten können da schon sein.
-
Danke DirkB., habe es nochmal überprüft und jetzt funktioniert bis Zeile 70 auch (fast) alles. Leider habe ich immernoch das Problem mit dem Programm adressuebernahme. Das will nicht funktionieren. Und ab den if else Verzweigungen funktioniert es auch schon nicht mehr. allerdings weiß ich da nicht weiter. Ich kopier mal den neuen Code hier rein. Danke für den Tipp mit dem farbig machen, ist übersichtlicher.
f.-th., Zeile 13 ist so beabsichtigt, da int/long nicht mit einer Null beginnen können (laut unserem Professor). Deshalb muss ich es als char initialisieren.#include <stdio.h> #include <stdlib.h> /* * */ struct adr_struktur { long pnr; char vname[32]; char nname[32]; char strasse[32]; char plz; char ort[32]; struct adr_struktur *next; struct adr_struktur adr; void adresseingabe(struct adr_struktur *adresse) } int main() { struct adr_struktur adr[10]; int i; for(i=0; i<10; i++); adresseingabe(&adr[i]); return(0); } void adresseingabe(struct adr_struktur *adresse) { printf("Personalnummer: \n"); scanf("%ld", &adresse->pnr); printf("Vorname: \n"); scanf("%s", adresse->vname); printf("Nachname: \n"); scanf("%s", adresse->nname); printf("Straße: \n"); scanf("%s", adresse->strasse); printf("Postleitzahl: \n"); scanf("%s", &adresse->plz); printf("Ort: \n"); scanf("%s", &adresse->ort); } struct adr_struktur *anfang=NULL; struct adr_struktur *aktuell=NULL; int Hauptprogramm () { if (anfang==NULL) //da lege ich das erste Element an, wenn noch kein Element angelegt ist anfang=calloc(1,sizeof(adr_struktur)); if (adr==NULL) printf("\nFEHLER!\n"); adresseingabe(anfang); anfang->next=NULL; struct adr_struktur tempstru; struct adr_struktur *hilfszeiger; adresseingabe(&tempstru); if (anfang==NULL) //hier muss ich auch das erste Element anlegen, allerdings gab es da vorher schon ein erstes -> wie funktioniert der Unterschied zwischen Liste ist leer und das kleinste Element einfügen? anfang=calloc(1, sizeof(adr_struktur)); adressuebernahme(anfang, &tempstru); anfang->next=NULL else aktuell=anfang; while((aktuell->next!=NULL)&&(aktuell->pnr<tempstru.pnr)); aktuell=aktuell->next; if((aktuell->next==NULL)&&(aktuell->pnr<tempstru.pnr)) aktuell->next=calloc(1, sizeof(adr_struktur)); aktuell=aktuell->next; adressuebernahme(aktuell, &tempstru); aktuell->next=NULL; else if((aktuell==anfang)&&aktuell->pnr>tempstru.pnr) anfang=calloc(1, sizeof(adr_struktur)); anfang->next=aktuell; adressuebernahme(anfang, &tempstru); else hilfszeiger=anfang; while(hilfszeiger->next!=aktuell) hilfszeiger=hilfszeiger->next; aktuell=calloc(1, sizeof(adr_struktur)); adressuebernahme(aktuell, &tempstru); aktuell->next=hilfszeiger->next; hilfszeiger->next=aktuell; } void adressuebernahme(struct adr_struktur *adrziel), struct adr_struktur *adrquelle) { adrziel->pnr=adrquelle->pnr; strcpy(adrziel->vname, adrquelle->vname); strcpy(adrziel->nname, adrquelle->nname); strcpy(adrziel->strasse, adrquelle->strasse); adrziel->plz=adrquelle->plz; strcpy(adrziel->ort, adrquelle->ort); }
Jetzt habe ich in Zeile 18 das Problem, dass immer noch dort steht: Unable to resolve identifier adresse und in Zeile 19 unexpected token }, aber ich dachte hier ist ja der struct teil zu ende...
Dann kommt ab Zeile 59,, dass adressuebernahme nicht erkannt wird. Aber das PRogramm habe ich ja eigentlich unten noch aufgeführt. Und danach sind die Fehler eigentlich gleich geblieben. Vor allem mit else bekomme ich Probleme, das erkennt er nicht. Was muss ich da tun?
-
Schau dir nochmals an wie structs aufgebaut werden.
Mir sagt mein Buch als Beispiel:struct adres { char vname[20]; char nname[20]; long PLZ; char ort[20]; int geburtsjahr; } adressen;
In Zeile 19 fehlt bei dir das Semikolon. Das wäre jetzt so auf anhieb, was mit als erstes ins Auge fällt.
-
SeinEngel schrieb:
Danke DirkB., habe es nochmal überprüft und jetzt funktioniert bis Zeile 70 auch (fast) alles. Leider habe ich immernoch das Problem mit dem Programm adressuebernahme. Das will nicht funktionieren.
Was geht da denn nicht?
Abgesehen davon, brauchst du das auch gar nicht.
Stattadressuebernahme(aktuell, &tempstru);
darfst du gerne
*aktuell = tempstru;
schreiben
SeinEngel schrieb:
Und ab den if else Verzweigungen funktioniert es auch schon nicht mehr. allerdings weiß ich da nicht weiter.
Hinter einem if, else while, for ... wird immer nur eine Anweisung ausgeführt. Wenn du mehr möchtest, musst du diese mit Hilfe der { } zu einem Block zusammen fassen.
SeinEngel schrieb:
f.-th., Zeile 13 ist so beabsichtigt, da int/long nicht mit einer Null beginnen können (laut unserem Professor). Deshalb muss ich es als char initialisieren.
Ein char ist auch nur ein Ganzzahltyp mit kleinem Wertebereich.
Falls du da Zeichenketten drin speichern willst, kommst du mit einem Zeichen nicht weit.
-
Zeile 13 mit der führenden Null sollte so auch nicht funktionieren.
Kannst ja mal testen eine PLZ von Dresden da hin zu bekommen.
Die Klammer Zeile 19 würde ich noch ein wenig höher positionieren
Zeile 24 -> dein Compiler akzeptiert die - aber ob die so funktioniert wie du dir das vorstellst
Zeile 39 je nach dem wie du deine Zeile 13 baust, anpassen.Warum formatierst du deinen Quelltext immer noch nicht einheitlich
Beispiel: Zeile 49 bis 52?MfG f.-th.
-
Hab ich etwas übersehen?
Wie kommt dein Programm zum Quelltext nach Zeile 45
-
TheRulor, wenn ich das so mache, wie es bei dir steht, dann bekomme ich auf einmal nur noch Fehler im main Programm... Das finde ich jetzt seltsam.
DirkB., da schmeißt er mir nur Meldungen raus wie unable to resolve oder unexpected token, und das für jedes wort. warum brauch ich das nicht? das ist eigentlich dafür da, dass die adresse übernommen wird in einen neuen container.
Was muss ich dann für einen Datentyp nehmen statt char? Unser Professor hat uns das so erklärt...
Danke für den Tipp mit den Klammern. Jetzt sind die Fehler weg.
f.-th., wieso denkst du, dass die Schleife nicht funktioniert?
wie soll ich es denn deiner Meinung nach formatieren?
den Quelltext hab ich noch neu gemacht, weil ich dachte ich brauch irgendwie noch eine art hauptprogramm wo das alles drinsteht.
hier nochmal mit verbesserungen:#include <stdio.h> #include <stdlib.h> /* * */ struct adr_struktur { long pnr; char vname[32]; char nname[32]; char strasse[32]; char plz; char ort[32]; struct adr_struktur *next; }; struct adr_struktur adr; void adresseingabe(struct adr_struktur *adresse) int main() { struct adr_struktur adr[10]; int i; for(i=0; i<10; i++); adresseingabe(&adr[i]); return(0); } void adresseingabe(struct adr_struktur *adresse) { printf("Personalnummer: \n"); scanf("%ld", &adresse->pnr); printf("Vorname: \n"); scanf("%s", adresse->vname); printf("Nachname: \n"); scanf("%s", adresse->nname); printf("Straße: \n"); scanf("%s", adresse->strasse); printf("Postleitzahl: \n"); scanf("%s", &adresse->plz); printf("Ort: \n"); scanf("%s", &adresse->ort); } struct adr_struktur *anfang=NULL; struct adr_struktur *aktuell=NULL; int Hauptprogramm () { if (anfang==NULL) //da lege ich das erste Element an, wenn noch kein Element angelegt ist { anfang=calloc(1,sizeof(adr_struktur)); if (adr==NULL) printf("\nFEHLER!\n"); adresseingabe(anfang); anfang->next=NULL; } struct adr_struktur tempstru; struct adr_struktur *hilfszeiger; adresseingabe(&tempstru); if (anfang==NULL) //hier muss ich auch das erste Element anlegen, allerdings gab es da vorher schon ein erstes -> wie funktioniert der Unterschied zwischen Liste ist leer und das kleinste Element einfügen? { anfang=calloc(1, sizeof(adr_struktur)); adressuebernahme(anfang, &tempstru); anfang->next; } else { aktuell=anfang; while((aktuell->next!=NULL)&&(aktuell->pnr<tempstru.pnr)); aktuell=aktuell->next; } if((aktuell->next==NULL)&&(aktuell->pnr<tempstru.pnr)) { aktuell->next=calloc(1, sizeof(adr_struktur)); aktuell=aktuell->next; adressuebernahme(aktuell, &tempstru); aktuell->next=NULL; } else if((aktuell==anfang)&&aktuell->pnr>tempstru.pnr) { anfang=calloc(1, sizeof(adr_struktur)); anfang->next=aktuell; adressuebernahme(anfang, &tempstru); } else { hilfszeiger=anfang; while(hilfszeiger->next!=aktuell) hilfszeiger=hilfszeiger->next; aktuell=calloc(1, sizeof(adr_struktur)); adressuebernahme(aktuell, &tempstru); aktuell->next=hilfszeiger->next; hilfszeiger->next=aktuell; } } void adressuebernahme(struct adr_struktur *adrziel), struct adr_struktur *adrquelle) { adrziel->pnr=adrquelle->pnr; strcpy(adrziel->vname, adrquelle->vname); strcpy(adrziel->nname, adrquelle->nname); strcpy(adrziel->strasse, adrquelle->strasse); adrziel->plz=adrquelle->plz; strcpy(adrziel->ort, adrquelle->ort); }
-
Zur plz: Wie hast du es denn beim Ort gelöst?
Zur for-Schleife: Das ; ist eine leere anweisung. Wenn man das mal anders hinschreibt
for(i=0; i<10; i++) ; // Das hier ist der Schleifenkörper. adresseingabe(&adr[i]);
und dem Wissen, wieviele Anweisungen direkt nach for ausgeführt werden, wird es evtl klar.
Strukturen kann man seit über 20 Jahren direkt zuweisen.
In Zeile 19 hast du ein ; vergessen.
In Zeile 95 hast du eine ) zu viel.Du musst deine Funktionen schon aufrufen. Die main() wird automatisch beim Programmstart ausgeführt. Alles andere liegt bei dir.
Und ob die Funktion jetzt Hauptprogramm heißt oder Ich_weiss_nicht_was_ich_tue spielt dabei keine Rolle.Sortier mal dein Code. Die globalen Variablen mitten im Text machen das gAnze verdammt unübersichtlich.
Besorg dir ein Buch über C. Ein richtiges echtes Buch aus Papier.
Und arbeite es durch.