Hilfe zu Prog. mit Linked List, Pointern und Strukturen
-
Hallo, ich bin neu hier im Forum.
Ich lerne gerade an der FOS im 2. Jahr C. Nun haben wir eine Aufgabe bekommen, wo wir datensätze einlesen sollen und die mittels linked list administriert werden.ich habe ein ganz banales problem und komme nicht dahinter. wenn ich die fkt. ListInput aufrufe, gibt mir das dos-fenster nur "drücken sie eine beliebige taste..." zurück und verabschiedet sich dann.
hier der code, wo die fkt. aufgerufen wird:
switch(c) { case 1: ListShow(head); break; case 2: if(ListInput(head)==0) exit; break; case 3: break; case 4: break; case 5: break; case 6: printf("ENDE\n"); break; }
hier die fkt.:
int ListInput(struct ListHead *hd) { // Platz im Heap für Knoten und Datensatz anfordern struct knot *V1 = (struct knot*)malloc(sizeof(struct knot)); struct telefon *V2 = (struct telefon*)malloc(sizeof(struct telefon)); if(!V1){printf("Fehler beim Anlegen von Speicherplatz"); getch(); free(V1); return 0;} if(!V2){printf("Fehler beim Anlegen von Speicherplatz"); getch(); free(V2); return 0;} if(hd->head == NULL) hd->head = V1; // wenn 1. Eintrag: head zeigt auf neuen Knoten hd->tail->next = V1; // alter letzter Knoten zeigt auf neuen Knoten hd->tail = V1; // ListHead->Tail zeigt auf neuen Knoten V1->pdata = V2; // knot->pdata zeigt auf neuen Datensatz V1->next = NULL; // knot->next zeigt auf NULL printf("Neuen Datensatz eingeben\n\n"); printf(" Vorname: "); scanf("%c", &V2->vname); printf(" Nachname: "); scanf("%c", &V2->nname); printf(" Telefonnummer: "); scanf("%i", &V2->telnr); return 1; }
nicht wundern, wenn was noch nicht ganz stimmt... konnte ja noch nicht wirklich testen. zwar gibt der compiler nix zurück, aber man weiß ja nie... mich wunderts, dass er einfach gar nichts macht... vielleicht kann mir hier ja jemand helfen. nicht schlagen, bin doch noch anfänger
gruß,
Nathano
-
Nathano schrieb:
nicht schlagen, bin doch noch anfänger
du solltest mal alles posten, nicht nur so'n paar auszüge. da werden sie geholfen!
-
okay...
#include <stdio.h> #include <conio.h> #include <alloc.h> struct ListHead { struct knot *head; struct knot *tail; }; struct knot { struct knot *next; struct telefon *pdata; }; struct telefon { char nname[20]; char vname[20]; int telnr[15]; }; struct ListHead* ListCreate(void); void ListShow(struct ListHead *hd); int ListInput(struct ListHead *hd); //**************************** Hauptprogramm ******************************************** void main(void) { int c=0; // Leere Liste erstellen mit Fkt. ListCreate struct ListHead *head = ListCreate(); // Menue while(c!=6){ do{ printf("Operation auswaehlen (zug. Zahl eingeben):\n\n"); printf(" 1 - Anzeigen des Listeninhalts\n"); printf(" 2 - Neuen Eintrag hinzufuegen\n"); printf(" 3 - Liste komplett loeschen\n"); printf(" 4 - Eintrag anzeigen\n"); printf(" 5 - Eintrag loeschen\n"); printf(" 6 - Ende\n\n"); scanf("%i",&c); system("cls"); }while(!(c>0 && c<7)); switch(c) { case 1: ListShow(head); break; case 2: if(ListInput(head)==0) exit; break; case 3: break; case 4: break; case 5: break; case 6: printf("ENDE\n"); break; } } getch(); free(head); } //**************************** Leere Liste erstellen ************************************ struct ListHead * ListCreate(void) { // Platz im Heap anfordern struct ListHead *V = (struct ListHead*)malloc(sizeof(struct ListHead)); if(!V){printf("Fehler beim Anlegen der Liste"); free(V); exit;} // Kopf und Ende auf NULL zeigen lassen (leere Liste) V->head = V->tail = NULL; return V; } //**************************** Liste anzeigen ******************************************* void ListShow(struct ListHead *hd) { int i=1; // *pk den Kopf der Liste zuweisen struct knot *pk = hd->head; printf(" Name/Vorname/Nummer\n"); printf("------------------------------\n"); // Solange pk != dem Ende der Liste, gib nacheinander die Daten aus for(; pk != hd->tail; i++){ printf("%i. Satz: ", i); printf("%c", pk->pdata->nname); printf("/%c", pk->pdata->vname); printf("/%i\n", pk->pdata->telnr); pk = pk->next; } // Den letzten Datansatz ausgeben printf("%i. Satz: ", i); printf("%c", hd->tail->pdata->nname); printf("/%c", hd->tail->pdata->vname); printf("/%i\n", hd->tail->pdata->telnr); getch(); } //**************************** Datensatz einlesen *************************************** int ListInput(struct ListHead *hd) { // Platz im Heap für Knoten und Datensatz anfordern struct knot *V1 = (struct knot*)malloc(sizeof(struct knot)); struct telefon *V2 = (struct telefon*)malloc(sizeof(struct telefon)); if(!V1){printf("Fehler beim Anlegen von Speicherplatz"); getch(); free(V1); return 0;} if(!V2){printf("Fehler beim Anlegen von Speicherplatz"); getch(); free(V2); return 0;} if(hd->head == NULL) hd->head = V1; // wenn 1. Eintrag: head zeigt auf neuen Knoten hd->tail->next = V1; // alter letzter Knoten zeigt auf neuen Knoten hd->tail = V1; // ListHead->Tail zeigt auf neuen Knoten V1->pdata = V2; // knot->pdata zeigt auf neuen Datensatz V1->next = NULL; // knot->next zeigt auf NULL printf("Neuen Datensatz eingeben\n\n"); printf(" Vorname: "); scanf("%c", &V2->vname); printf(" Nachname: "); scanf("%c", &V2->nname); printf(" Telefonnummer: "); scanf("%i", &V2->telnr); return 1; }
-
Einen String ließt man mit
scanf("%s", V2->vname);
und nicht mit
scanf("%c", &V2->vname);
ein.
-
*an den kopf stoß*
okay... danke. aber das geschilderte problem besteht immernoch. ich komm nicht von meiner leitung
-
ich lese einmal "exit", naemlich im switch. ist das gewollt oder soll es "return" heissen?
-
wenn ich return; schreibe, meckert er, dass es bei void main(void) nichts zum returnen gibt... deswegen exit. aber dürfte doch nicht das prob sein?
edit: void main(void) ist vom lehrer vorgeschrieben...
-
richte dem lehrer doch bitte in meinem namen aus, jede main ist vom typ int. danke
sag mal, spuckt dein compiler keine fehlermeldungen aus oder was?
foo.c:27: warning: return type of 'main' is not `int' foo.c: In function `main': foo.c:42: warning: implicit declaration of function `system' foo.c:48: error: `exit' undeclared (first use in this function) foo.c:48: error: (Each undeclared identifier is reported only once foo.c:48: error: for each function it appears in.) foo.c:56: warning: implicit declaration of function `free' foo.c: In function `ListCreate': foo.c:63: warning: implicit declaration of function `malloc' foo.c:64: error: `exit' undeclared (first use in this function) foo.c: In function `ListShow': foo.c:82: warning: int format, pointer arg (arg 2) foo.c:83: warning: int format, pointer arg (arg 2) foo.c:84: warning: int format, pointer arg (arg 2) foo.c:89: warning: int format, pointer arg (arg 2) foo.c:90: warning: int format, pointer arg (arg 2) foo.c:91: warning: int format, pointer arg (arg 2) foo.c: In function `ListInput': foo.c:112: warning: char format, different type arg (arg 2) foo.c:114: warning: char format, different type arg (arg 2) foo.c:116: warning: int format, different type arg (arg 2)
arbeite die erstmal ab.
system gibts in stdlib.h
malloc und free gibts da auch.fuer weiteres kannst du hier nachschlagen:
http://www-ccs.ucsd.edu/c/
http://www.cppreference.com/
-
oha... nein, tut er nicht... danke!